<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>1. Fabric环境搭建 | AJ</title>
    <meta name="generator" content="VuePress 1.5.0">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <script>
            var _hmt = _hmt || [];
            (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?51b8c2e72d1adf96524638ce85bb7d72";
            var s = document.getElementsByTagName("script")[0]; 
            s.parentNode.insertBefore(hm, s);

            // 引入谷歌,不需要可删除这段
            var hm1 = document.createElement("script");
            hm1.src = "https://www.googletagmanager.com/gtag/js?id=G-B7351EYS04";
            var s1 = document.getElementsByTagName("script")[0]; 
            s1.parentNode.insertBefore(hm1, s1);
            })();

            // 谷歌加载,不需要可删除
            window.dataLayer = window.dataLayer || [];
            function gtag(){dataLayer.push(arguments);}
            gtag('js', new Date());

            gtag('config', 'G-B7351EYS04');
        </script>
    <meta name="description" content="阿俊博客|记录一个程序员的成长历程 阿俊博客(blog.zhequtao.com)记录一个后端程序员的成长历程,分享他的学习笔记和心得,还有些开发必备技巧哦! java golang web html dev开发">
    <link rel="preload" href="/assets/css/0.styles.a3df589e.css" as="style"><link rel="preload" href="/assets/js/app.cb35c8f6.js" as="script"><link rel="preload" href="/assets/js/2.063846a6.js" as="script"><link rel="preload" href="/assets/js/4.1ffb4609.js" as="script"><link rel="preload" href="/assets/js/63.4df55c8b.js" as="script"><link rel="prefetch" href="/assets/js/10.5629fe4d.js"><link rel="prefetch" href="/assets/js/100.8417ccea.js"><link rel="prefetch" href="/assets/js/101.37fdb377.js"><link rel="prefetch" href="/assets/js/102.848b686d.js"><link rel="prefetch" href="/assets/js/103.6a2489a0.js"><link rel="prefetch" href="/assets/js/104.99e8899f.js"><link rel="prefetch" href="/assets/js/105.8b741763.js"><link rel="prefetch" href="/assets/js/106.08163715.js"><link rel="prefetch" href="/assets/js/107.21801349.js"><link rel="prefetch" href="/assets/js/108.e3a2892b.js"><link rel="prefetch" href="/assets/js/109.dab5618c.js"><link rel="prefetch" href="/assets/js/11.cddc1623.js"><link rel="prefetch" href="/assets/js/110.f5249b39.js"><link rel="prefetch" href="/assets/js/111.9abf8bce.js"><link rel="prefetch" href="/assets/js/112.8eb86924.js"><link rel="prefetch" href="/assets/js/113.c180ed46.js"><link rel="prefetch" href="/assets/js/114.2370f5b5.js"><link rel="prefetch" href="/assets/js/115.88dc3fd8.js"><link rel="prefetch" href="/assets/js/116.63403600.js"><link rel="prefetch" href="/assets/js/117.83674aa0.js"><link rel="prefetch" href="/assets/js/118.9c58c685.js"><link rel="prefetch" href="/assets/js/119.621f9a70.js"><link rel="prefetch" href="/assets/js/12.ff3d03f5.js"><link rel="prefetch" href="/assets/js/120.a6d2b7f7.js"><link rel="prefetch" href="/assets/js/121.ae0ce9d1.js"><link rel="prefetch" href="/assets/js/122.de240e6d.js"><link rel="prefetch" href="/assets/js/123.b043e3e4.js"><link rel="prefetch" href="/assets/js/124.550af937.js"><link rel="prefetch" href="/assets/js/125.6f06b34c.js"><link rel="prefetch" href="/assets/js/126.38d64604.js"><link rel="prefetch" href="/assets/js/127.a948db56.js"><link rel="prefetch" href="/assets/js/128.4ca789e0.js"><link rel="prefetch" href="/assets/js/129.59be4505.js"><link rel="prefetch" href="/assets/js/13.e9f75cc3.js"><link rel="prefetch" href="/assets/js/130.ddae76a9.js"><link rel="prefetch" href="/assets/js/131.d969c265.js"><link rel="prefetch" href="/assets/js/132.5f43ce5c.js"><link rel="prefetch" href="/assets/js/133.b651af22.js"><link rel="prefetch" href="/assets/js/134.2499236a.js"><link rel="prefetch" href="/assets/js/135.4180596c.js"><link rel="prefetch" href="/assets/js/136.2c309233.js"><link rel="prefetch" href="/assets/js/137.72ca42dd.js"><link rel="prefetch" href="/assets/js/138.3772cd38.js"><link rel="prefetch" href="/assets/js/139.1d0a53da.js"><link rel="prefetch" href="/assets/js/14.be4b89ed.js"><link rel="prefetch" href="/assets/js/140.22368353.js"><link rel="prefetch" href="/assets/js/141.a14aef3c.js"><link rel="prefetch" href="/assets/js/142.2041ce3a.js"><link rel="prefetch" href="/assets/js/143.377262ec.js"><link rel="prefetch" href="/assets/js/144.8fcbc368.js"><link rel="prefetch" href="/assets/js/145.46da36bf.js"><link rel="prefetch" href="/assets/js/146.eceae0d9.js"><link rel="prefetch" href="/assets/js/147.e1bd6531.js"><link rel="prefetch" href="/assets/js/148.76f193ce.js"><link rel="prefetch" href="/assets/js/149.587bd581.js"><link rel="prefetch" href="/assets/js/15.e3219ac0.js"><link rel="prefetch" href="/assets/js/150.169c71e0.js"><link rel="prefetch" href="/assets/js/151.384021ea.js"><link rel="prefetch" href="/assets/js/152.0f20cf03.js"><link rel="prefetch" href="/assets/js/153.fd94af1e.js"><link rel="prefetch" href="/assets/js/154.a550f5dc.js"><link rel="prefetch" href="/assets/js/155.ba1ae86e.js"><link rel="prefetch" href="/assets/js/156.3b98ded0.js"><link rel="prefetch" href="/assets/js/157.cd378596.js"><link rel="prefetch" href="/assets/js/158.c138d0df.js"><link rel="prefetch" href="/assets/js/159.2635f7f4.js"><link rel="prefetch" href="/assets/js/16.c9c35d42.js"><link rel="prefetch" href="/assets/js/160.d51b4126.js"><link rel="prefetch" href="/assets/js/161.5dc29e7b.js"><link rel="prefetch" href="/assets/js/162.f257a92b.js"><link rel="prefetch" href="/assets/js/163.9eb75e40.js"><link rel="prefetch" href="/assets/js/164.8fb1e22b.js"><link rel="prefetch" href="/assets/js/165.49255503.js"><link rel="prefetch" href="/assets/js/166.e54539e6.js"><link rel="prefetch" href="/assets/js/167.a06acdb0.js"><link rel="prefetch" href="/assets/js/168.948ab620.js"><link rel="prefetch" href="/assets/js/169.7d756812.js"><link rel="prefetch" href="/assets/js/17.81067bc8.js"><link rel="prefetch" href="/assets/js/170.ffe63330.js"><link rel="prefetch" href="/assets/js/171.835398b9.js"><link rel="prefetch" href="/assets/js/172.3987be39.js"><link rel="prefetch" href="/assets/js/173.e3cedb8a.js"><link rel="prefetch" href="/assets/js/174.11a32588.js"><link rel="prefetch" href="/assets/js/175.da6f9782.js"><link rel="prefetch" href="/assets/js/176.50e55edc.js"><link rel="prefetch" href="/assets/js/177.a89a1d17.js"><link rel="prefetch" href="/assets/js/178.7ad3ce84.js"><link rel="prefetch" href="/assets/js/179.98a1343b.js"><link rel="prefetch" href="/assets/js/18.b67caf4c.js"><link rel="prefetch" href="/assets/js/180.4e98599b.js"><link rel="prefetch" href="/assets/js/181.dd885afd.js"><link rel="prefetch" href="/assets/js/182.789990c8.js"><link rel="prefetch" href="/assets/js/183.f11ca2fd.js"><link rel="prefetch" href="/assets/js/184.fcf128ec.js"><link rel="prefetch" href="/assets/js/185.54e1e9b6.js"><link rel="prefetch" href="/assets/js/186.db91021a.js"><link rel="prefetch" href="/assets/js/187.5309dd42.js"><link rel="prefetch" href="/assets/js/188.615821ea.js"><link rel="prefetch" href="/assets/js/189.f23f1d42.js"><link rel="prefetch" href="/assets/js/19.294a011c.js"><link rel="prefetch" href="/assets/js/190.efe894bc.js"><link rel="prefetch" href="/assets/js/191.0d14904a.js"><link rel="prefetch" href="/assets/js/192.efd25a9e.js"><link rel="prefetch" href="/assets/js/193.88151f34.js"><link rel="prefetch" href="/assets/js/194.efedce14.js"><link rel="prefetch" href="/assets/js/195.03ac15bb.js"><link rel="prefetch" href="/assets/js/196.fbc18389.js"><link rel="prefetch" href="/assets/js/197.0257ab5e.js"><link rel="prefetch" href="/assets/js/198.f1de2817.js"><link rel="prefetch" href="/assets/js/199.8f1c166b.js"><link rel="prefetch" href="/assets/js/20.1a41edb1.js"><link rel="prefetch" href="/assets/js/200.4af99727.js"><link rel="prefetch" href="/assets/js/201.9f8caef1.js"><link rel="prefetch" href="/assets/js/202.6f07d705.js"><link rel="prefetch" href="/assets/js/203.5012fe50.js"><link rel="prefetch" href="/assets/js/204.3a0dfd8e.js"><link rel="prefetch" href="/assets/js/205.0ba9b606.js"><link rel="prefetch" href="/assets/js/206.663a49ec.js"><link rel="prefetch" href="/assets/js/207.b2406149.js"><link rel="prefetch" href="/assets/js/208.b0b2dfd8.js"><link rel="prefetch" href="/assets/js/209.41a0ec9f.js"><link rel="prefetch" href="/assets/js/21.b6ea6f9a.js"><link rel="prefetch" href="/assets/js/210.6f36beb8.js"><link rel="prefetch" href="/assets/js/211.90ef6e5c.js"><link rel="prefetch" href="/assets/js/212.42339063.js"><link rel="prefetch" href="/assets/js/213.a2bfeda9.js"><link rel="prefetch" href="/assets/js/214.5c7eb42a.js"><link rel="prefetch" href="/assets/js/215.18260ae5.js"><link rel="prefetch" href="/assets/js/216.7678fd29.js"><link rel="prefetch" href="/assets/js/217.9d936f88.js"><link rel="prefetch" href="/assets/js/218.bac403c4.js"><link rel="prefetch" href="/assets/js/219.9d8cb16b.js"><link rel="prefetch" href="/assets/js/22.367cc253.js"><link rel="prefetch" href="/assets/js/220.375b7707.js"><link rel="prefetch" href="/assets/js/221.3e400da4.js"><link rel="prefetch" href="/assets/js/222.8fbd2857.js"><link rel="prefetch" href="/assets/js/223.76a10075.js"><link rel="prefetch" href="/assets/js/224.ff94cc4e.js"><link rel="prefetch" href="/assets/js/225.d4688ca6.js"><link rel="prefetch" href="/assets/js/226.b13b18af.js"><link rel="prefetch" href="/assets/js/227.288d0f96.js"><link rel="prefetch" href="/assets/js/228.60430ac0.js"><link rel="prefetch" href="/assets/js/229.da728342.js"><link rel="prefetch" href="/assets/js/23.bc3de730.js"><link rel="prefetch" href="/assets/js/230.d8417d20.js"><link rel="prefetch" href="/assets/js/231.6a9ce0b4.js"><link rel="prefetch" href="/assets/js/232.7611b413.js"><link rel="prefetch" href="/assets/js/233.94712cf9.js"><link rel="prefetch" href="/assets/js/234.93888298.js"><link rel="prefetch" href="/assets/js/235.62506981.js"><link rel="prefetch" href="/assets/js/236.5a055c7c.js"><link rel="prefetch" href="/assets/js/237.0a6c4902.js"><link rel="prefetch" href="/assets/js/238.e5f37663.js"><link rel="prefetch" href="/assets/js/239.331bba86.js"><link rel="prefetch" href="/assets/js/24.82f0901c.js"><link rel="prefetch" href="/assets/js/240.59591cfc.js"><link rel="prefetch" href="/assets/js/241.ce671f47.js"><link rel="prefetch" href="/assets/js/242.fb2542fa.js"><link rel="prefetch" href="/assets/js/243.74abc73d.js"><link rel="prefetch" href="/assets/js/244.ecd707b2.js"><link rel="prefetch" href="/assets/js/245.d728367b.js"><link rel="prefetch" href="/assets/js/246.9270e7fe.js"><link rel="prefetch" href="/assets/js/247.a421ba15.js"><link rel="prefetch" href="/assets/js/248.e759132e.js"><link rel="prefetch" href="/assets/js/249.3077fb46.js"><link rel="prefetch" href="/assets/js/25.95c551dc.js"><link rel="prefetch" href="/assets/js/250.5fe4dd03.js"><link rel="prefetch" href="/assets/js/251.4b8fe76c.js"><link rel="prefetch" href="/assets/js/252.0d1cf7ea.js"><link rel="prefetch" href="/assets/js/253.89d16ba0.js"><link rel="prefetch" href="/assets/js/254.8d1afc68.js"><link rel="prefetch" href="/assets/js/255.64e680cb.js"><link rel="prefetch" href="/assets/js/256.9defbd0e.js"><link rel="prefetch" href="/assets/js/257.1fef24fd.js"><link rel="prefetch" href="/assets/js/258.4e205286.js"><link rel="prefetch" href="/assets/js/259.f3d56efc.js"><link rel="prefetch" href="/assets/js/26.7fe56bac.js"><link rel="prefetch" href="/assets/js/260.378299e6.js"><link rel="prefetch" href="/assets/js/261.8e4fb397.js"><link rel="prefetch" href="/assets/js/262.54595d98.js"><link rel="prefetch" href="/assets/js/263.fb333dc1.js"><link rel="prefetch" href="/assets/js/264.13d13301.js"><link rel="prefetch" href="/assets/js/265.c85104bc.js"><link rel="prefetch" href="/assets/js/266.9f3d1f1c.js"><link rel="prefetch" href="/assets/js/267.fb392815.js"><link rel="prefetch" href="/assets/js/268.add7eacb.js"><link rel="prefetch" href="/assets/js/269.7e49fcc7.js"><link rel="prefetch" href="/assets/js/27.5547e5f0.js"><link rel="prefetch" href="/assets/js/270.22342070.js"><link rel="prefetch" href="/assets/js/271.59917b1a.js"><link rel="prefetch" href="/assets/js/272.4a4751d5.js"><link rel="prefetch" href="/assets/js/273.f4c2fa5c.js"><link rel="prefetch" href="/assets/js/274.1208bc94.js"><link rel="prefetch" href="/assets/js/275.f6528753.js"><link rel="prefetch" href="/assets/js/276.a68772cd.js"><link rel="prefetch" href="/assets/js/277.f154ab32.js"><link rel="prefetch" href="/assets/js/278.bb616a63.js"><link rel="prefetch" href="/assets/js/279.6a356cff.js"><link rel="prefetch" href="/assets/js/28.b08b2847.js"><link rel="prefetch" href="/assets/js/280.5afc20fc.js"><link rel="prefetch" href="/assets/js/281.3cd86225.js"><link rel="prefetch" href="/assets/js/282.3ecb92aa.js"><link rel="prefetch" href="/assets/js/283.85159ea7.js"><link rel="prefetch" href="/assets/js/284.b6545c68.js"><link rel="prefetch" href="/assets/js/285.5e83ee29.js"><link rel="prefetch" href="/assets/js/286.2aad298d.js"><link rel="prefetch" href="/assets/js/287.3ca76244.js"><link rel="prefetch" href="/assets/js/288.5b17963d.js"><link rel="prefetch" href="/assets/js/289.f47a759b.js"><link rel="prefetch" href="/assets/js/29.562dbf7d.js"><link rel="prefetch" href="/assets/js/290.36b603c7.js"><link rel="prefetch" href="/assets/js/291.a9bd8951.js"><link rel="prefetch" href="/assets/js/292.dfc54f28.js"><link rel="prefetch" href="/assets/js/293.2d061212.js"><link rel="prefetch" href="/assets/js/294.6d564a9e.js"><link rel="prefetch" href="/assets/js/295.a31dd593.js"><link rel="prefetch" href="/assets/js/296.3101e5e8.js"><link rel="prefetch" href="/assets/js/297.7efde936.js"><link rel="prefetch" href="/assets/js/298.8bb3aa68.js"><link rel="prefetch" href="/assets/js/299.8b51e6bd.js"><link rel="prefetch" href="/assets/js/3.76257eb7.js"><link rel="prefetch" href="/assets/js/30.221adea2.js"><link rel="prefetch" href="/assets/js/300.62effe45.js"><link rel="prefetch" href="/assets/js/301.98c863c5.js"><link rel="prefetch" href="/assets/js/302.e3493ab2.js"><link rel="prefetch" href="/assets/js/303.800c8028.js"><link rel="prefetch" href="/assets/js/304.b6f08986.js"><link rel="prefetch" href="/assets/js/305.09af356b.js"><link rel="prefetch" href="/assets/js/306.d0d3589d.js"><link rel="prefetch" href="/assets/js/307.ee2fd249.js"><link rel="prefetch" href="/assets/js/308.f3f76368.js"><link rel="prefetch" href="/assets/js/309.d2b5ce40.js"><link rel="prefetch" href="/assets/js/31.334fc8bb.js"><link rel="prefetch" href="/assets/js/310.b4fa2feb.js"><link rel="prefetch" href="/assets/js/311.7d747ef3.js"><link rel="prefetch" href="/assets/js/312.89bdff40.js"><link rel="prefetch" href="/assets/js/313.875b82fe.js"><link rel="prefetch" href="/assets/js/314.0bbe51c4.js"><link rel="prefetch" href="/assets/js/315.cc07dbcf.js"><link rel="prefetch" href="/assets/js/316.bc72b152.js"><link rel="prefetch" href="/assets/js/317.55462812.js"><link rel="prefetch" href="/assets/js/318.a158fda0.js"><link rel="prefetch" href="/assets/js/319.b03a5bd2.js"><link rel="prefetch" href="/assets/js/32.d6826b16.js"><link rel="prefetch" href="/assets/js/320.a5bd19b0.js"><link rel="prefetch" href="/assets/js/321.4f9faaa7.js"><link rel="prefetch" href="/assets/js/322.dbd3b4fa.js"><link rel="prefetch" href="/assets/js/323.a04e2062.js"><link rel="prefetch" href="/assets/js/324.c45b46cf.js"><link rel="prefetch" href="/assets/js/325.cd1460c4.js"><link rel="prefetch" href="/assets/js/326.bd90ef85.js"><link rel="prefetch" href="/assets/js/327.8bf38ef7.js"><link rel="prefetch" href="/assets/js/328.99e9aed3.js"><link rel="prefetch" href="/assets/js/329.de0012cb.js"><link rel="prefetch" href="/assets/js/33.b1059062.js"><link rel="prefetch" href="/assets/js/330.59f11391.js"><link rel="prefetch" href="/assets/js/331.6d16a13c.js"><link rel="prefetch" href="/assets/js/332.922ca235.js"><link rel="prefetch" href="/assets/js/333.c94c3602.js"><link rel="prefetch" href="/assets/js/334.77e02010.js"><link rel="prefetch" href="/assets/js/335.1e0c4f7b.js"><link rel="prefetch" href="/assets/js/336.5675dc4f.js"><link rel="prefetch" href="/assets/js/337.bb6e11dc.js"><link rel="prefetch" href="/assets/js/338.294981e9.js"><link rel="prefetch" href="/assets/js/339.d0376372.js"><link rel="prefetch" href="/assets/js/34.0c7d5782.js"><link rel="prefetch" href="/assets/js/340.64596428.js"><link rel="prefetch" href="/assets/js/341.ec0f9409.js"><link rel="prefetch" href="/assets/js/342.7abc47c4.js"><link rel="prefetch" href="/assets/js/343.4262d486.js"><link rel="prefetch" href="/assets/js/344.8729ad8c.js"><link rel="prefetch" href="/assets/js/345.c210d888.js"><link rel="prefetch" href="/assets/js/346.6f42f7cb.js"><link rel="prefetch" href="/assets/js/347.81b41ae5.js"><link rel="prefetch" href="/assets/js/348.07eca37c.js"><link rel="prefetch" href="/assets/js/349.8019d6f3.js"><link rel="prefetch" href="/assets/js/35.ae14e37f.js"><link rel="prefetch" href="/assets/js/350.57da2e7b.js"><link rel="prefetch" href="/assets/js/351.2e99afdf.js"><link rel="prefetch" href="/assets/js/352.67dd88b7.js"><link rel="prefetch" href="/assets/js/353.15b9f624.js"><link rel="prefetch" href="/assets/js/354.a63e8432.js"><link rel="prefetch" href="/assets/js/355.bbc16ee9.js"><link rel="prefetch" href="/assets/js/356.ff63d3bb.js"><link rel="prefetch" href="/assets/js/357.4fb2d941.js"><link rel="prefetch" href="/assets/js/358.55182977.js"><link rel="prefetch" href="/assets/js/359.265c3d26.js"><link rel="prefetch" href="/assets/js/36.b9ed4cf1.js"><link rel="prefetch" href="/assets/js/360.ced80eb3.js"><link rel="prefetch" href="/assets/js/361.afe6ba84.js"><link rel="prefetch" href="/assets/js/362.c2b62518.js"><link rel="prefetch" href="/assets/js/363.0c4a4800.js"><link rel="prefetch" href="/assets/js/364.ce60291b.js"><link rel="prefetch" href="/assets/js/365.0e3a61f9.js"><link rel="prefetch" href="/assets/js/366.d53ccb03.js"><link rel="prefetch" href="/assets/js/367.689e464d.js"><link rel="prefetch" href="/assets/js/368.418c571f.js"><link rel="prefetch" href="/assets/js/369.c2fff3c8.js"><link rel="prefetch" href="/assets/js/37.a021ac57.js"><link rel="prefetch" href="/assets/js/370.a932b958.js"><link rel="prefetch" href="/assets/js/371.7d153241.js"><link rel="prefetch" href="/assets/js/372.fb9878fa.js"><link rel="prefetch" href="/assets/js/373.85772e03.js"><link rel="prefetch" href="/assets/js/374.b4a8b1b6.js"><link rel="prefetch" href="/assets/js/375.32f70596.js"><link rel="prefetch" href="/assets/js/376.a16d79a8.js"><link rel="prefetch" href="/assets/js/377.c996b7e1.js"><link rel="prefetch" href="/assets/js/378.d37d15c7.js"><link rel="prefetch" href="/assets/js/379.b81ba7dd.js"><link rel="prefetch" href="/assets/js/38.89138658.js"><link rel="prefetch" href="/assets/js/380.524c9b31.js"><link rel="prefetch" href="/assets/js/381.7ebfd6db.js"><link rel="prefetch" href="/assets/js/382.29edda0f.js"><link rel="prefetch" href="/assets/js/383.9642a212.js"><link rel="prefetch" href="/assets/js/384.086e3b42.js"><link rel="prefetch" href="/assets/js/385.a9bb46a8.js"><link rel="prefetch" href="/assets/js/386.f2561a39.js"><link rel="prefetch" href="/assets/js/387.ba9b6aaa.js"><link rel="prefetch" href="/assets/js/388.e0ace495.js"><link rel="prefetch" href="/assets/js/389.ba8c09dd.js"><link rel="prefetch" href="/assets/js/39.04f331e3.js"><link rel="prefetch" href="/assets/js/390.de1bb48b.js"><link rel="prefetch" href="/assets/js/391.7cc6edeb.js"><link rel="prefetch" href="/assets/js/392.0493a6f7.js"><link rel="prefetch" href="/assets/js/393.ba2d3e62.js"><link rel="prefetch" href="/assets/js/394.b3aa9224.js"><link rel="prefetch" href="/assets/js/395.f4df3a60.js"><link rel="prefetch" href="/assets/js/396.09644790.js"><link rel="prefetch" href="/assets/js/397.76163964.js"><link rel="prefetch" href="/assets/js/398.377fd8fc.js"><link rel="prefetch" href="/assets/js/399.39059be5.js"><link rel="prefetch" href="/assets/js/40.a21abf05.js"><link rel="prefetch" href="/assets/js/400.559a547f.js"><link rel="prefetch" href="/assets/js/401.bc6d738c.js"><link rel="prefetch" href="/assets/js/402.c504ed7b.js"><link rel="prefetch" href="/assets/js/403.77a0af9c.js"><link rel="prefetch" href="/assets/js/404.0f408cc6.js"><link rel="prefetch" href="/assets/js/405.90b0bab6.js"><link rel="prefetch" href="/assets/js/406.01b11432.js"><link rel="prefetch" href="/assets/js/407.58991ce5.js"><link rel="prefetch" href="/assets/js/408.9806278e.js"><link rel="prefetch" href="/assets/js/409.8d9b4bb3.js"><link rel="prefetch" href="/assets/js/41.6bcfc592.js"><link rel="prefetch" href="/assets/js/410.02dee620.js"><link rel="prefetch" href="/assets/js/411.3d12d3a6.js"><link rel="prefetch" href="/assets/js/412.37a62624.js"><link rel="prefetch" href="/assets/js/413.bda7ca34.js"><link rel="prefetch" href="/assets/js/414.2abb6547.js"><link rel="prefetch" href="/assets/js/415.1d271923.js"><link rel="prefetch" href="/assets/js/416.d1b11dfe.js"><link rel="prefetch" href="/assets/js/417.fcbf07ff.js"><link rel="prefetch" href="/assets/js/418.524d40ba.js"><link rel="prefetch" href="/assets/js/419.f264e463.js"><link rel="prefetch" href="/assets/js/42.ec85a270.js"><link rel="prefetch" href="/assets/js/420.8b99e60d.js"><link rel="prefetch" href="/assets/js/421.c697d876.js"><link rel="prefetch" href="/assets/js/422.4af54ae0.js"><link rel="prefetch" href="/assets/js/423.b75f24ff.js"><link rel="prefetch" href="/assets/js/424.ea80054f.js"><link rel="prefetch" href="/assets/js/425.804b48b0.js"><link rel="prefetch" href="/assets/js/426.ffed8383.js"><link rel="prefetch" href="/assets/js/427.2040bd22.js"><link rel="prefetch" href="/assets/js/428.b878fb56.js"><link rel="prefetch" href="/assets/js/429.f81fd922.js"><link rel="prefetch" href="/assets/js/43.c174449d.js"><link rel="prefetch" href="/assets/js/430.16f328ab.js"><link rel="prefetch" href="/assets/js/431.56f11924.js"><link rel="prefetch" href="/assets/js/432.e4c77710.js"><link rel="prefetch" href="/assets/js/433.29acf14b.js"><link rel="prefetch" href="/assets/js/434.33ee22fc.js"><link rel="prefetch" href="/assets/js/435.516f7600.js"><link rel="prefetch" href="/assets/js/436.28ae526a.js"><link rel="prefetch" href="/assets/js/437.b9bac473.js"><link rel="prefetch" href="/assets/js/438.711bd934.js"><link rel="prefetch" href="/assets/js/439.fe5f28bd.js"><link rel="prefetch" href="/assets/js/44.8704338b.js"><link rel="prefetch" href="/assets/js/440.b2f48747.js"><link rel="prefetch" href="/assets/js/441.4862a724.js"><link rel="prefetch" href="/assets/js/442.751f8ae7.js"><link rel="prefetch" href="/assets/js/443.9998dbe9.js"><link rel="prefetch" href="/assets/js/444.23d3f688.js"><link rel="prefetch" href="/assets/js/445.72419f35.js"><link rel="prefetch" href="/assets/js/446.21e02b7b.js"><link rel="prefetch" href="/assets/js/447.6bd039e5.js"><link rel="prefetch" href="/assets/js/448.af29ff31.js"><link rel="prefetch" href="/assets/js/449.bbdca196.js"><link rel="prefetch" href="/assets/js/45.f8a2a3b3.js"><link rel="prefetch" href="/assets/js/450.32e470b8.js"><link rel="prefetch" href="/assets/js/451.f4c8ff6a.js"><link rel="prefetch" href="/assets/js/452.c0ec8943.js"><link rel="prefetch" href="/assets/js/453.5af475c6.js"><link rel="prefetch" href="/assets/js/454.567aa6c1.js"><link rel="prefetch" href="/assets/js/455.326072d1.js"><link rel="prefetch" href="/assets/js/456.64b88847.js"><link rel="prefetch" href="/assets/js/457.61c91559.js"><link rel="prefetch" href="/assets/js/458.4f4d43d6.js"><link rel="prefetch" href="/assets/js/459.a88891cb.js"><link rel="prefetch" href="/assets/js/46.90855a0f.js"><link rel="prefetch" href="/assets/js/460.fb9e15f6.js"><link rel="prefetch" href="/assets/js/461.998a4991.js"><link rel="prefetch" href="/assets/js/462.56ecfb03.js"><link rel="prefetch" href="/assets/js/463.582cd053.js"><link rel="prefetch" href="/assets/js/464.f12a0050.js"><link rel="prefetch" href="/assets/js/465.cc3b08a8.js"><link rel="prefetch" href="/assets/js/466.ea7e4ce2.js"><link rel="prefetch" href="/assets/js/467.58700d93.js"><link rel="prefetch" href="/assets/js/468.bb9998cd.js"><link rel="prefetch" href="/assets/js/469.232d261d.js"><link rel="prefetch" href="/assets/js/47.02516d33.js"><link rel="prefetch" href="/assets/js/470.90ab2be8.js"><link rel="prefetch" href="/assets/js/471.3652fec6.js"><link rel="prefetch" href="/assets/js/472.bc7517c9.js"><link rel="prefetch" href="/assets/js/473.27b7892f.js"><link rel="prefetch" href="/assets/js/474.0d488768.js"><link rel="prefetch" href="/assets/js/475.bc33cf17.js"><link rel="prefetch" href="/assets/js/476.76ce67eb.js"><link rel="prefetch" href="/assets/js/477.a20657f6.js"><link rel="prefetch" href="/assets/js/478.8905ef26.js"><link rel="prefetch" href="/assets/js/479.23ec3dc9.js"><link rel="prefetch" href="/assets/js/48.8d38983c.js"><link rel="prefetch" href="/assets/js/480.105bf58e.js"><link rel="prefetch" href="/assets/js/481.d62a3699.js"><link rel="prefetch" href="/assets/js/482.6cb10cdb.js"><link rel="prefetch" href="/assets/js/483.15b9ef53.js"><link rel="prefetch" href="/assets/js/484.794aff9c.js"><link rel="prefetch" href="/assets/js/485.3e6ef3cb.js"><link rel="prefetch" href="/assets/js/486.fc20eb22.js"><link rel="prefetch" href="/assets/js/487.2a4f7d47.js"><link rel="prefetch" href="/assets/js/488.24ba9af5.js"><link rel="prefetch" href="/assets/js/489.d451928e.js"><link rel="prefetch" href="/assets/js/49.bd70c59c.js"><link rel="prefetch" href="/assets/js/490.d83e4fc7.js"><link rel="prefetch" href="/assets/js/491.0210a738.js"><link rel="prefetch" href="/assets/js/492.3a69cd85.js"><link rel="prefetch" href="/assets/js/493.89d2920f.js"><link rel="prefetch" href="/assets/js/494.b7d1c15e.js"><link rel="prefetch" href="/assets/js/495.7ccfe17f.js"><link rel="prefetch" href="/assets/js/496.0d6c912a.js"><link rel="prefetch" href="/assets/js/497.087ca2c6.js"><link rel="prefetch" href="/assets/js/498.f2b3c894.js"><link rel="prefetch" href="/assets/js/499.e741f312.js"><link rel="prefetch" href="/assets/js/5.405f2620.js"><link rel="prefetch" href="/assets/js/50.9df07553.js"><link rel="prefetch" href="/assets/js/500.cb9babb9.js"><link rel="prefetch" href="/assets/js/501.63a859b6.js"><link rel="prefetch" href="/assets/js/502.f346b273.js"><link rel="prefetch" href="/assets/js/503.cdcd3de3.js"><link rel="prefetch" href="/assets/js/504.e83ec450.js"><link rel="prefetch" href="/assets/js/505.95f18293.js"><link rel="prefetch" href="/assets/js/506.02060a3c.js"><link rel="prefetch" href="/assets/js/507.859d6ae4.js"><link rel="prefetch" href="/assets/js/508.9724d886.js"><link rel="prefetch" href="/assets/js/509.e17dd53e.js"><link rel="prefetch" href="/assets/js/51.3dfc6350.js"><link rel="prefetch" href="/assets/js/510.ea0c942f.js"><link rel="prefetch" href="/assets/js/511.64a7f9a8.js"><link rel="prefetch" href="/assets/js/512.6cce418a.js"><link rel="prefetch" href="/assets/js/513.ea813fe8.js"><link rel="prefetch" href="/assets/js/514.10242470.js"><link rel="prefetch" href="/assets/js/515.5308bdf6.js"><link rel="prefetch" href="/assets/js/516.dfb113bc.js"><link rel="prefetch" href="/assets/js/517.96c71069.js"><link rel="prefetch" href="/assets/js/518.5594480e.js"><link rel="prefetch" href="/assets/js/519.91e848ae.js"><link rel="prefetch" href="/assets/js/52.dd230cd7.js"><link rel="prefetch" href="/assets/js/520.ebe69ce9.js"><link rel="prefetch" href="/assets/js/521.92b80342.js"><link rel="prefetch" href="/assets/js/522.6ce581ea.js"><link rel="prefetch" href="/assets/js/523.40b7f2f9.js"><link rel="prefetch" href="/assets/js/524.4ef256d3.js"><link rel="prefetch" href="/assets/js/525.19741e4a.js"><link rel="prefetch" href="/assets/js/526.e5de1675.js"><link rel="prefetch" href="/assets/js/527.9a79cd42.js"><link rel="prefetch" href="/assets/js/528.72732eb8.js"><link rel="prefetch" href="/assets/js/529.2ea03e45.js"><link rel="prefetch" href="/assets/js/53.a349c565.js"><link rel="prefetch" href="/assets/js/530.5d1103e7.js"><link rel="prefetch" href="/assets/js/531.82b032d6.js"><link rel="prefetch" href="/assets/js/532.12ee4beb.js"><link rel="prefetch" href="/assets/js/533.db9a90f7.js"><link rel="prefetch" href="/assets/js/534.fe139db4.js"><link rel="prefetch" href="/assets/js/535.056a6fbb.js"><link rel="prefetch" href="/assets/js/536.6bf85c15.js"><link rel="prefetch" href="/assets/js/537.6e2e1ccf.js"><link rel="prefetch" href="/assets/js/538.54eddb3b.js"><link rel="prefetch" href="/assets/js/539.6f00a207.js"><link rel="prefetch" href="/assets/js/54.e292b52f.js"><link rel="prefetch" href="/assets/js/540.9c956205.js"><link rel="prefetch" href="/assets/js/541.50f41228.js"><link rel="prefetch" href="/assets/js/542.a2b1879e.js"><link rel="prefetch" href="/assets/js/543.4e5e17c9.js"><link rel="prefetch" href="/assets/js/544.63d85227.js"><link rel="prefetch" href="/assets/js/545.c3923644.js"><link rel="prefetch" href="/assets/js/546.e64ad073.js"><link rel="prefetch" href="/assets/js/547.35a8752d.js"><link rel="prefetch" href="/assets/js/548.b62a1348.js"><link rel="prefetch" href="/assets/js/549.369e2ea0.js"><link rel="prefetch" href="/assets/js/55.21bb2983.js"><link rel="prefetch" href="/assets/js/550.b4632248.js"><link rel="prefetch" href="/assets/js/551.18f1879c.js"><link rel="prefetch" href="/assets/js/552.162e63cd.js"><link rel="prefetch" href="/assets/js/553.6998130e.js"><link rel="prefetch" href="/assets/js/554.89126c3d.js"><link rel="prefetch" href="/assets/js/555.a5f63b8a.js"><link rel="prefetch" href="/assets/js/556.35381cef.js"><link rel="prefetch" href="/assets/js/557.ceeecf52.js"><link rel="prefetch" href="/assets/js/558.253e6e4f.js"><link rel="prefetch" href="/assets/js/559.5cfbb773.js"><link rel="prefetch" href="/assets/js/56.5382d6b4.js"><link rel="prefetch" href="/assets/js/560.cca52f22.js"><link rel="prefetch" href="/assets/js/561.ea8d1141.js"><link rel="prefetch" href="/assets/js/562.c32e7b96.js"><link rel="prefetch" href="/assets/js/563.9bdd42e7.js"><link rel="prefetch" href="/assets/js/564.b3b87ec0.js"><link rel="prefetch" href="/assets/js/565.4be0d0f7.js"><link rel="prefetch" href="/assets/js/566.9f379d12.js"><link rel="prefetch" href="/assets/js/567.261e3181.js"><link rel="prefetch" href="/assets/js/568.4229e365.js"><link rel="prefetch" href="/assets/js/569.e662c167.js"><link rel="prefetch" href="/assets/js/57.8129f7e0.js"><link rel="prefetch" href="/assets/js/570.97ff6423.js"><link rel="prefetch" href="/assets/js/571.de1377cd.js"><link rel="prefetch" href="/assets/js/572.48b8400b.js"><link rel="prefetch" href="/assets/js/573.8251ebaf.js"><link rel="prefetch" href="/assets/js/574.ec3d6c1e.js"><link rel="prefetch" href="/assets/js/575.b0d429a1.js"><link rel="prefetch" href="/assets/js/576.98ce9170.js"><link rel="prefetch" href="/assets/js/577.85fc2017.js"><link rel="prefetch" href="/assets/js/578.1393ac7f.js"><link rel="prefetch" href="/assets/js/579.1340e178.js"><link rel="prefetch" href="/assets/js/58.85ac2740.js"><link rel="prefetch" href="/assets/js/580.a5979445.js"><link rel="prefetch" href="/assets/js/581.effdc269.js"><link rel="prefetch" href="/assets/js/582.13276063.js"><link rel="prefetch" href="/assets/js/583.357a2443.js"><link rel="prefetch" href="/assets/js/584.338ef731.js"><link rel="prefetch" href="/assets/js/585.87932741.js"><link rel="prefetch" href="/assets/js/586.b1d6e000.js"><link rel="prefetch" href="/assets/js/587.ed5b8377.js"><link rel="prefetch" href="/assets/js/588.16d2c418.js"><link rel="prefetch" href="/assets/js/589.c96fd7fa.js"><link rel="prefetch" href="/assets/js/59.0b225757.js"><link rel="prefetch" href="/assets/js/590.1a06b2a0.js"><link rel="prefetch" href="/assets/js/591.0efd886c.js"><link rel="prefetch" href="/assets/js/592.b22d0ef5.js"><link rel="prefetch" href="/assets/js/593.84ed6ebe.js"><link rel="prefetch" href="/assets/js/594.cd721b88.js"><link rel="prefetch" href="/assets/js/595.2400817a.js"><link rel="prefetch" href="/assets/js/596.f2c512d1.js"><link rel="prefetch" href="/assets/js/597.df10ec57.js"><link rel="prefetch" href="/assets/js/598.61ef6a7d.js"><link rel="prefetch" href="/assets/js/599.0bebb562.js"><link rel="prefetch" href="/assets/js/6.29d112b1.js"><link rel="prefetch" href="/assets/js/60.3bbab51d.js"><link rel="prefetch" href="/assets/js/600.1ea7596f.js"><link rel="prefetch" href="/assets/js/601.f2642bb3.js"><link rel="prefetch" href="/assets/js/602.400cc987.js"><link rel="prefetch" href="/assets/js/603.db77d173.js"><link rel="prefetch" href="/assets/js/604.0ffa30ae.js"><link rel="prefetch" href="/assets/js/605.32ca9607.js"><link rel="prefetch" href="/assets/js/606.8c1e5683.js"><link rel="prefetch" href="/assets/js/607.9c9463ef.js"><link rel="prefetch" href="/assets/js/608.d5efa77e.js"><link rel="prefetch" href="/assets/js/609.5bbffb7d.js"><link rel="prefetch" href="/assets/js/61.f7301486.js"><link rel="prefetch" href="/assets/js/610.5b0fc9da.js"><link rel="prefetch" href="/assets/js/611.bb8058c9.js"><link rel="prefetch" href="/assets/js/612.b0788f43.js"><link rel="prefetch" href="/assets/js/613.49511e65.js"><link rel="prefetch" href="/assets/js/614.fae3eacf.js"><link rel="prefetch" href="/assets/js/615.359e5899.js"><link rel="prefetch" href="/assets/js/616.905132f4.js"><link rel="prefetch" href="/assets/js/617.6c8c594e.js"><link rel="prefetch" href="/assets/js/618.6ac4f3ff.js"><link rel="prefetch" href="/assets/js/619.411a0c14.js"><link rel="prefetch" href="/assets/js/62.9aeede84.js"><link rel="prefetch" href="/assets/js/620.56155724.js"><link rel="prefetch" href="/assets/js/621.149d7933.js"><link rel="prefetch" href="/assets/js/622.f0c9bc08.js"><link rel="prefetch" href="/assets/js/623.e0989fbe.js"><link rel="prefetch" href="/assets/js/624.80b1f6a9.js"><link rel="prefetch" href="/assets/js/625.a0a392c4.js"><link rel="prefetch" href="/assets/js/626.56fd4e8a.js"><link rel="prefetch" href="/assets/js/627.264e7313.js"><link rel="prefetch" href="/assets/js/628.7a868b19.js"><link rel="prefetch" href="/assets/js/629.e7e15da1.js"><link rel="prefetch" href="/assets/js/630.998c9b61.js"><link rel="prefetch" href="/assets/js/631.69aa049c.js"><link rel="prefetch" href="/assets/js/632.da3882c1.js"><link rel="prefetch" href="/assets/js/633.0d49adf0.js"><link rel="prefetch" href="/assets/js/634.f9984ede.js"><link rel="prefetch" href="/assets/js/635.f0439f65.js"><link rel="prefetch" href="/assets/js/636.54de4194.js"><link rel="prefetch" href="/assets/js/637.55d1c226.js"><link rel="prefetch" href="/assets/js/638.2a9a510f.js"><link rel="prefetch" href="/assets/js/639.8bec360e.js"><link rel="prefetch" href="/assets/js/64.7f3e5e81.js"><link rel="prefetch" href="/assets/js/640.30d7f96e.js"><link rel="prefetch" href="/assets/js/641.68100098.js"><link rel="prefetch" href="/assets/js/642.4b793817.js"><link rel="prefetch" href="/assets/js/643.d86a81ea.js"><link rel="prefetch" href="/assets/js/644.76327ea2.js"><link rel="prefetch" href="/assets/js/645.0ac6a923.js"><link rel="prefetch" href="/assets/js/646.cd92f728.js"><link rel="prefetch" href="/assets/js/647.f2c624e1.js"><link rel="prefetch" href="/assets/js/648.c8f3b955.js"><link rel="prefetch" href="/assets/js/649.6370753b.js"><link rel="prefetch" href="/assets/js/65.2beeae9b.js"><link rel="prefetch" href="/assets/js/650.afe31909.js"><link rel="prefetch" href="/assets/js/651.87971ec0.js"><link rel="prefetch" href="/assets/js/652.0adf10a6.js"><link rel="prefetch" href="/assets/js/653.1f655726.js"><link rel="prefetch" href="/assets/js/654.53e24c7c.js"><link rel="prefetch" href="/assets/js/655.c95a66ea.js"><link rel="prefetch" href="/assets/js/656.38b5a5ea.js"><link rel="prefetch" href="/assets/js/657.3167aa94.js"><link rel="prefetch" href="/assets/js/658.7c40ff62.js"><link rel="prefetch" href="/assets/js/659.5d2b9b54.js"><link rel="prefetch" href="/assets/js/66.44b214db.js"><link rel="prefetch" href="/assets/js/660.96a8da9e.js"><link rel="prefetch" href="/assets/js/661.4de3b6c1.js"><link rel="prefetch" href="/assets/js/662.7d9bf181.js"><link rel="prefetch" href="/assets/js/663.4ccaf40a.js"><link rel="prefetch" href="/assets/js/664.7ab4fa53.js"><link rel="prefetch" href="/assets/js/665.32245d26.js"><link rel="prefetch" href="/assets/js/666.e6617151.js"><link rel="prefetch" href="/assets/js/667.fb3b0547.js"><link rel="prefetch" href="/assets/js/668.3d1b2e36.js"><link rel="prefetch" href="/assets/js/669.b769905f.js"><link rel="prefetch" href="/assets/js/67.c31aaacf.js"><link rel="prefetch" href="/assets/js/670.88ed3af3.js"><link rel="prefetch" href="/assets/js/671.1aff6bfe.js"><link rel="prefetch" href="/assets/js/672.c90888f7.js"><link rel="prefetch" href="/assets/js/673.81241fdc.js"><link rel="prefetch" href="/assets/js/674.838a424d.js"><link rel="prefetch" href="/assets/js/675.603ac896.js"><link rel="prefetch" href="/assets/js/676.ff44b5dc.js"><link rel="prefetch" href="/assets/js/677.41a8087a.js"><link rel="prefetch" href="/assets/js/678.f0eb8d04.js"><link rel="prefetch" href="/assets/js/679.db78199e.js"><link rel="prefetch" href="/assets/js/68.08607c89.js"><link rel="prefetch" href="/assets/js/680.8fded9d4.js"><link rel="prefetch" href="/assets/js/681.0b019dfd.js"><link rel="prefetch" href="/assets/js/682.746e9190.js"><link rel="prefetch" href="/assets/js/683.d5c00845.js"><link rel="prefetch" href="/assets/js/684.b3207cad.js"><link rel="prefetch" href="/assets/js/685.d78f18ba.js"><link rel="prefetch" href="/assets/js/686.5aaecd19.js"><link rel="prefetch" href="/assets/js/687.821a06f4.js"><link rel="prefetch" href="/assets/js/688.8bbc1890.js"><link rel="prefetch" href="/assets/js/689.79b49e8c.js"><link rel="prefetch" href="/assets/js/69.509245d6.js"><link rel="prefetch" href="/assets/js/690.fa62f9dd.js"><link rel="prefetch" href="/assets/js/691.d3eb1a60.js"><link rel="prefetch" href="/assets/js/692.738f14bb.js"><link rel="prefetch" href="/assets/js/693.e6a497a2.js"><link rel="prefetch" href="/assets/js/694.6eea1c54.js"><link rel="prefetch" href="/assets/js/695.88e6acee.js"><link rel="prefetch" href="/assets/js/696.de10297f.js"><link rel="prefetch" href="/assets/js/697.96d04062.js"><link rel="prefetch" href="/assets/js/698.200cc84f.js"><link rel="prefetch" href="/assets/js/699.f11fc627.js"><link rel="prefetch" href="/assets/js/7.c16198b8.js"><link rel="prefetch" href="/assets/js/70.5f6285b1.js"><link rel="prefetch" href="/assets/js/700.93d48f59.js"><link rel="prefetch" href="/assets/js/701.b861f29a.js"><link rel="prefetch" href="/assets/js/702.dc82e05c.js"><link rel="prefetch" href="/assets/js/703.625ce87c.js"><link rel="prefetch" href="/assets/js/704.005a0a7c.js"><link rel="prefetch" href="/assets/js/705.16ad9230.js"><link rel="prefetch" href="/assets/js/706.4eead30a.js"><link rel="prefetch" href="/assets/js/707.730306ce.js"><link rel="prefetch" href="/assets/js/708.e37e743a.js"><link rel="prefetch" href="/assets/js/709.f2144f52.js"><link rel="prefetch" href="/assets/js/71.d5d0dae5.js"><link rel="prefetch" href="/assets/js/710.ee9d9b17.js"><link rel="prefetch" href="/assets/js/711.2813c338.js"><link rel="prefetch" href="/assets/js/712.e801bce4.js"><link rel="prefetch" href="/assets/js/713.21fc267c.js"><link rel="prefetch" href="/assets/js/714.4ec35525.js"><link rel="prefetch" href="/assets/js/715.fdc3cc84.js"><link rel="prefetch" href="/assets/js/716.324932ad.js"><link rel="prefetch" href="/assets/js/717.a072a66f.js"><link rel="prefetch" href="/assets/js/718.575e0305.js"><link rel="prefetch" href="/assets/js/719.5fdd55de.js"><link rel="prefetch" href="/assets/js/72.25648231.js"><link rel="prefetch" href="/assets/js/720.61477f23.js"><link rel="prefetch" href="/assets/js/721.c8bdab00.js"><link rel="prefetch" href="/assets/js/722.9255f385.js"><link rel="prefetch" href="/assets/js/723.f27792a4.js"><link rel="prefetch" href="/assets/js/724.cd504f88.js"><link rel="prefetch" href="/assets/js/725.55c845fa.js"><link rel="prefetch" href="/assets/js/726.bb49a9db.js"><link rel="prefetch" href="/assets/js/727.53d587fe.js"><link rel="prefetch" href="/assets/js/728.86972387.js"><link rel="prefetch" href="/assets/js/729.02fa0263.js"><link rel="prefetch" href="/assets/js/73.29902c1f.js"><link rel="prefetch" href="/assets/js/730.817156d1.js"><link rel="prefetch" href="/assets/js/731.6f5d6735.js"><link rel="prefetch" href="/assets/js/732.9a5ff781.js"><link rel="prefetch" href="/assets/js/733.bcb13916.js"><link rel="prefetch" href="/assets/js/734.11482b19.js"><link rel="prefetch" href="/assets/js/735.8c0d62f3.js"><link rel="prefetch" href="/assets/js/736.06465705.js"><link rel="prefetch" href="/assets/js/737.79741d87.js"><link rel="prefetch" href="/assets/js/738.cad12ff9.js"><link rel="prefetch" href="/assets/js/739.cb09e552.js"><link rel="prefetch" href="/assets/js/74.bcf666a0.js"><link rel="prefetch" href="/assets/js/740.029b1950.js"><link rel="prefetch" href="/assets/js/741.b937216a.js"><link rel="prefetch" href="/assets/js/742.ec02c706.js"><link rel="prefetch" href="/assets/js/743.70a96283.js"><link rel="prefetch" href="/assets/js/744.909b870c.js"><link rel="prefetch" href="/assets/js/745.80defb2d.js"><link rel="prefetch" href="/assets/js/746.fb972248.js"><link rel="prefetch" href="/assets/js/747.1a7b52fd.js"><link rel="prefetch" href="/assets/js/748.036f5d16.js"><link rel="prefetch" href="/assets/js/749.bd9a413d.js"><link rel="prefetch" href="/assets/js/75.23c5a54d.js"><link rel="prefetch" href="/assets/js/750.3f1ae8f5.js"><link rel="prefetch" href="/assets/js/751.8897bc9f.js"><link rel="prefetch" href="/assets/js/752.9b387659.js"><link rel="prefetch" href="/assets/js/753.f411ce21.js"><link rel="prefetch" href="/assets/js/754.26def684.js"><link rel="prefetch" href="/assets/js/755.923aff62.js"><link rel="prefetch" href="/assets/js/756.9965743a.js"><link rel="prefetch" href="/assets/js/757.0c6bbbfd.js"><link rel="prefetch" href="/assets/js/758.a830f8b1.js"><link rel="prefetch" href="/assets/js/759.987cad77.js"><link rel="prefetch" href="/assets/js/76.f54f3d4f.js"><link rel="prefetch" href="/assets/js/760.9f2652a0.js"><link rel="prefetch" href="/assets/js/761.df01a0ee.js"><link rel="prefetch" href="/assets/js/762.e0c05a1a.js"><link rel="prefetch" href="/assets/js/763.da8a60bd.js"><link rel="prefetch" href="/assets/js/764.9f2a2830.js"><link rel="prefetch" href="/assets/js/765.44e61161.js"><link rel="prefetch" href="/assets/js/766.cd7da8c1.js"><link rel="prefetch" href="/assets/js/767.6ea1fea2.js"><link rel="prefetch" href="/assets/js/768.91529b8f.js"><link rel="prefetch" href="/assets/js/769.194d7a3e.js"><link rel="prefetch" href="/assets/js/77.3d43a163.js"><link rel="prefetch" href="/assets/js/770.227fd5b9.js"><link rel="prefetch" href="/assets/js/771.44d5e37e.js"><link rel="prefetch" href="/assets/js/772.234d9bf6.js"><link rel="prefetch" href="/assets/js/773.ff1dfb6a.js"><link rel="prefetch" href="/assets/js/774.d401364f.js"><link rel="prefetch" href="/assets/js/775.37a7cf41.js"><link rel="prefetch" href="/assets/js/776.0cd10853.js"><link rel="prefetch" href="/assets/js/777.599a3a48.js"><link rel="prefetch" href="/assets/js/778.eef27a95.js"><link rel="prefetch" href="/assets/js/779.29351199.js"><link rel="prefetch" href="/assets/js/78.fd0780ac.js"><link rel="prefetch" href="/assets/js/780.74caed94.js"><link rel="prefetch" href="/assets/js/781.ee0fa9b5.js"><link rel="prefetch" href="/assets/js/782.7cffed09.js"><link rel="prefetch" href="/assets/js/783.7f01f518.js"><link rel="prefetch" href="/assets/js/784.5f65e3d7.js"><link rel="prefetch" href="/assets/js/785.d7e13880.js"><link rel="prefetch" href="/assets/js/786.6110d12f.js"><link rel="prefetch" href="/assets/js/787.334a5cdd.js"><link rel="prefetch" href="/assets/js/788.f261bc71.js"><link rel="prefetch" href="/assets/js/789.b6d74f7d.js"><link rel="prefetch" href="/assets/js/79.7b5d6224.js"><link rel="prefetch" href="/assets/js/790.fa948ec4.js"><link rel="prefetch" href="/assets/js/791.22080013.js"><link rel="prefetch" href="/assets/js/792.31ce806c.js"><link rel="prefetch" href="/assets/js/793.9fd0c56f.js"><link rel="prefetch" href="/assets/js/794.44a8cd9c.js"><link rel="prefetch" href="/assets/js/795.9f8346e5.js"><link rel="prefetch" href="/assets/js/796.0de9c7a1.js"><link rel="prefetch" href="/assets/js/797.83ac32a6.js"><link rel="prefetch" href="/assets/js/798.393fc81d.js"><link rel="prefetch" href="/assets/js/799.c1fb3981.js"><link rel="prefetch" href="/assets/js/8.3275ed06.js"><link rel="prefetch" href="/assets/js/80.df3f0a1f.js"><link rel="prefetch" href="/assets/js/800.2832adeb.js"><link rel="prefetch" href="/assets/js/801.04c58fc4.js"><link rel="prefetch" href="/assets/js/81.3d90ef6b.js"><link rel="prefetch" href="/assets/js/82.2d42448d.js"><link rel="prefetch" href="/assets/js/83.900b4de2.js"><link rel="prefetch" href="/assets/js/84.ff570f67.js"><link rel="prefetch" href="/assets/js/85.e3b3af39.js"><link rel="prefetch" href="/assets/js/86.17b5aedc.js"><link rel="prefetch" href="/assets/js/87.f931d1d6.js"><link rel="prefetch" href="/assets/js/88.d55863cd.js"><link rel="prefetch" href="/assets/js/89.15a9a6d7.js"><link rel="prefetch" href="/assets/js/9.04948a9d.js"><link rel="prefetch" href="/assets/js/90.22696aa9.js"><link rel="prefetch" href="/assets/js/91.f1bd8a2e.js"><link rel="prefetch" href="/assets/js/92.85733094.js"><link rel="prefetch" href="/assets/js/93.59bacfd7.js"><link rel="prefetch" href="/assets/js/94.a5f9b7a0.js"><link rel="prefetch" href="/assets/js/95.be52d65a.js"><link rel="prefetch" href="/assets/js/96.0b76ba8e.js"><link rel="prefetch" href="/assets/js/97.28183cd4.js"><link rel="prefetch" href="/assets/js/98.2d22829c.js"><link rel="prefetch" href="/assets/js/99.ed602a20.js">
    <link rel="stylesheet" href="/assets/css/0.styles.a3df589e.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">AJ</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link">主页</a></div><div class="nav-item"><a href="/op/" class="nav-link">Devops</a></div><div class="nav-item"><a href="/golang/" class="nav-link">Go</a></div><div class="nav-item"><a href="/go-block/" class="nav-link router-link-active">区块链</a></div><div class="nav-item"><a href="/k8s/" class="nav-link">k8s</a></div><div class="nav-item"><a href="/about.html" class="nav-link">关于我</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><span class="title">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/go-learning/" class="nav-link">go-learning</a></li><li class="dropdown-item"><!----> <a href="/post/flutter-guide/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/mysql/" class="nav-link">mysql</a></li><li class="dropdown-item"><!----> <a href="/python/" class="nav-link">python</a></li></ul></div></div> <a href="https://github.com/ChinaArJun" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/" class="nav-link">主页</a></div><div class="nav-item"><a href="/op/" class="nav-link">Devops</a></div><div class="nav-item"><a href="/golang/" class="nav-link">Go</a></div><div class="nav-item"><a href="/go-block/" class="nav-link router-link-active">区块链</a></div><div class="nav-item"><a href="/k8s/" class="nav-link">k8s</a></div><div class="nav-item"><a href="/about.html" class="nav-link">关于我</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><span class="title">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/go-learning/" class="nav-link">go-learning</a></li><li class="dropdown-item"><!----> <a href="/post/flutter-guide/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/mysql/" class="nav-link">mysql</a></li><li class="dropdown-item"><!----> <a href="/python/" class="nav-link">python</a></li></ul></div></div> <a href="https://github.com/ChinaArJun" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav> <div></div> <div style="padding-left:1.5rem;"><div></div></div> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>区块链基础</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/blockchain/encryption-expand.html" class="sidebar-link">常见的密码技术</a></li><li><a href="/go-block/blockchain/encryption.html" class="sidebar-link">密码学安全</a></li><li><a href="/go-block/blockchain/ethereum.html" class="sidebar-link">以太坊智能合约</a></li><li><a href="/go-block/blockchain/hyperledgerfabric.html" class="sidebar-link">hyperledger fabric</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Hyperledger Fabric 1.2</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/fabric/1搭建网络-纯手动.html" class="sidebar-link">1搭建网络-纯手动</a></li><li><a href="/go-block/fabric/1环境搭建.html" class="sidebar-link">1环境搭建</a></li><li><a href="/go-block/fabric/2Fabric介绍.html" class="sidebar-link">2Fabric介绍</a></li><li><a href="/go-block/fabric/3Fabric核心模块.html" class="sidebar-link">3Fabric核心模块</a></li><li><a href="/go-block/fabric/4网络搭建-脚本.html" class="sidebar-link">4网络搭建-脚本</a></li><li><a href="/go-block/fabric/5智能合约.html" class="sidebar-link">5智能合约</a></li><li><a href="/go-block/fabric/6Fabric账号.html" class="sidebar-link">6Fabric账号</a></li><li><a href="/go-block/fabric/7Solo多机多节点部署.html" class="sidebar-link">7Solo多机多节点部署</a></li><li><a href="/go-block/fabric/8Kafka多机多节点部署.html" class="sidebar-link">8Kafka多机多节点部署</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Hyperledger Fabric 2.X</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/fabric2.x/" aria-current="page" class="sidebar-link">2.X目录</a></li></ul></section></li></ul> </aside> <!----> <!----> <main class="page"><div class="theme-default-content" style="margin-bottom:-5rem;"><div class="bar"><div class="bar-intro"><div class="text">
      流逝的是岁月，不变的是情怀.
        </div> <div class="text">
      坚持学习，是为了成就更好的自己. <br></div> <div>公众号[中关村程序员]</div></div></div> <!----></div> <div class="theme-default-content content__default"><h2 id="_1-fabric环境搭建"><a href="#_1-fabric环境搭建" class="header-anchor">#</a> 1. Fabric环境搭建</h2> <p>准备工作</p> <blockquote><ol><li>官方帮助文档：https://hyperledger-fabric.readthedocs.io/en/release-1.4/</li> <li>安装 cURL(https://curl.haxx.se/download.html),<code>curl --version</code> 查询版本</li> <li>安装docker，<code>docker --version</code> 查询版本</li> <li>安装docker-compose,<code>docker-compose --version</code> 查询版本</li> <li>安装 go 语言环境，<code>go version</code> 查询版本</li> <li>安装node.js, <code>node -v</code> 查询版本</li> <li>Python 版本要求为 2.7，<code>python --version</code> 查询版本</li></ol></blockquote> <h3 id="_1-1-安装docker"><a href="#_1-1-安装docker" class="header-anchor">#</a> 1.1 安装docker</h3> <ol><li><p>基础软件安装</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 安装基本软件</span>
$ <span class="token function">sudo</span> <span class="token function">apt-get</span> update
$ <span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> apt-transport-https ca-certificates <span class="token function">curl</span> <span class="token function">git</span> software-properties-common lrzsz -y
</code></pre></div></li> <li><p>添加阿里的docker镜像仓库</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 添加阿里的docker镜像仓库</span>
$ <span class="token function">curl</span> -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg <span class="token operator">|</span> <span class="token function">sudo</span> apt-key <span class="token function">add</span> -
$ <span class="token function">sudo</span> add-apt-repository <span class="token string">&quot;deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu <span class="token variable"><span class="token variable">$(</span>lsb_release -cs<span class="token variable">)</span></span> stable&quot;</span>
<span class="token comment"># 更新软件源</span>
$ <span class="token function">sudo</span> <span class="token function">apt-get</span> update
</code></pre></div></li> <li><p>安装docker</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 安装docker</span>
$ <span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> docker-ce -y
<span class="token comment"># 查看安装的docker版本</span>
$ docker version
	Client:
         Version:           <span class="token number">18.06</span>.1-ce
         API version:       <span class="token number">1.38</span>
         Go version:        go1.10.3
         Git commit:        e68fc7a
         Built:             Tue Aug <span class="token number">21</span> <span class="token number">17</span>:24:51 <span class="token number">2018</span>
         OS/Arch:           linux/amd64
         Experimental:      <span class="token boolean">false</span>
    Got permission denied <span class="token keyword">while</span> trying to connect to the Docker daemon socket at
    unix:///var/run/docker.sock: Get
    http://%2Fvar%2Frun%2Fdocker.sock/v1.38/version: 
    dial unix /var/run/docker.sock: connect: <span class="token variable"><span class="token variable">`</span>permission denied<span class="token variable">`</span></span>
<span class="token comment"># 当前用户直接操作docker时, 权限不够, 需要做下面的第4不操作</span>
</code></pre></div></li> <li><p>将当前用户添加到docker组</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 将用户加入该 group 内。然后退出并重新登录就生效啦。</span>
$ <span class="token function">sudo</span> gpasswd -a <span class="token variable">${<span class="token environment constant">USER</span>}</span> docker
<span class="token comment"># 重启docker服务</span>
$ systemctl restart docker
<span class="token comment"># 当前用户切换到docker群组</span>
$ newgrp - docker
$ docker version
	Client:
         Version:           <span class="token number">18.06</span>.1-ce
         API version:       <span class="token number">1.38</span>
         Go version:        go1.10.3
         Git commit:        e68fc7a
         Built:             Tue Aug <span class="token number">21</span> <span class="token number">17</span>:24:51 <span class="token number">2018</span>
         OS/Arch:           linux/amd64
         Experimental:      <span class="token boolean">false</span>

    Server:
         Engine:
         Version:          <span class="token number">18.06</span>.1-ce
         API version:      <span class="token number">1.38</span> <span class="token punctuation">(</span>minimum version <span class="token number">1.12</span><span class="token punctuation">)</span>
         Go version:       go1.10.3
         Git commit:       e68fc7a
         Built:            Tue Aug <span class="token number">21</span> <span class="token number">17</span>:23:15 <span class="token number">2018</span>
         OS/Arch:          linux/amd64
         Experimental:     <span class="token boolean">false</span>
</code></pre></div></li> <li><p>安装docker-compose</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment">#安装依赖工具</span>
$ <span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> python-pip -y
<span class="token comment">#安装编排工具</span>
$ <span class="token function">sudo</span> pip <span class="token function">install</span> docker-compose
<span class="token comment">#查看版本</span>
$ <span class="token function">sudo</span> docker-compose version
</code></pre></div></li></ol> <h3 id="_1-2-安装go"><a href="#_1-2-安装go" class="header-anchor">#</a> 1.2 安装go</h3> <div class="language-http extra-class"><pre class="language-http"><code># 安装包下载地址:
<span class="token header-name keyword">https:</span>//golang.org/dl/  - 翻墙
<span class="token header-name keyword">https:</span>//studygolang.com/dl - 国内镜像源
</code></pre></div><p><img src="assets/hyper1.png" alt="1536569707498"></p> <p>如果没有进行安装包下载, 课直接使用如下命令(目前最新版本):</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 1. 使用wget工具下载安装包</span>
$ <span class="token function">wget</span> https://dl.google.com/go/go1.11.linux-amd64.tar.gz
<span class="token comment"># 2. 解压tar包到/usr/local</span>
$ <span class="token function">sudo</span> <span class="token function">tar</span> zxvf go1.11.linux-amd64.tar.gz -C /usr/local
<span class="token comment"># 3. 创建Go目录</span>
$ <span class="token function">mkdir</span> <span class="token environment constant">$HOME</span>/go
<span class="token comment"># 4. 用vi打开~./bashrc，配置环境变量</span>
$ <span class="token function">vim</span> ~/.bashrc
<span class="token comment"># 5. 增加下面的环境变量，保存退出</span>
	<span class="token builtin class-name">export</span> <span class="token assign-left variable">GOROOT</span><span class="token operator">=</span>/usr/local/go
    <span class="token builtin class-name">export</span> <span class="token assign-left variable">GOPATH</span><span class="token operator">=</span><span class="token environment constant">$HOME</span>/go
    <span class="token builtin class-name">export</span> <span class="token assign-left variable"><span class="token environment constant">PATH</span></span><span class="token operator">=</span><span class="token environment constant">$PATH</span><span class="token builtin class-name">:</span><span class="token variable">$GOROOT</span>/bin:<span class="token variable">$GOPATH</span>/bin
<span class="token comment"># 6. 使环境变量立即生效, 一些命令二选一</span>
$ <span class="token builtin class-name">source</span> ~/.bashrc  
$ <span class="token builtin class-name">.</span> ~/.bashrc
<span class="token comment"># 7. 检测go是否安装好</span>
$ go version
</code></pre></div><h3 id="_1-3-安装node-js"><a href="#_1-3-安装node-js" class="header-anchor">#</a> 1.3 安装Node.js</h3> <ol><li><p>官方下载地址</p> <div class="language-http extra-class"><pre class="language-http"><code><span class="token header-name keyword">https:</span>//nodejs.org/en/download/
</code></pre></div><p><img src="assets/hyper3.png" alt="1536572107278"></p></li> <li><p>下载二进制源码包</p> <div class="language-shell extra-class"><pre class="language-shell"><code>$ <span class="token function">wget</span> https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz
</code></pre></div></li> <li><p>解压并安装</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 指定压缩包解压到/opt目录下</span>
$ <span class="token function">sudo</span> <span class="token function">tar</span> xvf node-v8.11.4-linux-x64.tar.xz -C /opt
	- 在/opt目录下得到 node-v8.11.4-linux-x64 目录
</code></pre></div></li> <li><p>将node.js设置为全局可用</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 打开系统级别的配置文件 /etc/profile</span>
$ <span class="token function">sudo</span> <span class="token function">vim</span> /etc/profile
<span class="token comment"># 添加如下配置项, 保存退出</span>
    <span class="token builtin class-name">export</span> <span class="token assign-left variable">NODEJS_HOME</span><span class="token operator">=</span>/opt/node-v8.11.4-linux-x64
    <span class="token builtin class-name">export</span> <span class="token assign-left variable"><span class="token environment constant">PATH</span></span><span class="token operator">=</span><span class="token environment constant">$PATH</span><span class="token builtin class-name">:</span><span class="token variable">$NODEJS_HOME</span>/bin
<span class="token comment"># 重新加载配置文件</span>
$ <span class="token builtin class-name">.</span> /etc/profile
/etc/profile -<span class="token operator">&gt;</span> 设置环境变量的配置文件
	- 对当前系统下所有用户生效
</code></pre></div></li> <li><p>测试</p> <div class="language-shell extra-class"><pre class="language-shell"><code>$ node -v
</code></pre></div></li></ol> <h3 id="_1-4-部署hyperledger-fabric"><a href="#_1-4-部署hyperledger-fabric" class="header-anchor">#</a> 1.4 部署hyperledger Fabric</h3> <blockquote><ol><li><p>下载了一些可执行程序</p></li> <li><p>下载了一些实例 (测试案例)</p></li> <li><p>下载了fabric的镜像</p> <p>/var/lib/docker</p></li></ol></blockquote> <ol><li><p>下载并执行fabric的引导脚本bootstrap.sh</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 参考资料</span>
https://hyperledger-fabric.readthedocs.io/en/release-1.4/install.html
<span class="token comment"># 创建放置的目录，然后进入该目录，用curl下载脚本。</span>
$ <span class="token builtin class-name">cd</span> ~ <span class="token comment"># 这里在家目录下创建放置目录</span>
$ <span class="token function">mkdir</span> hyperledger-fabric <span class="token comment"># 创建放置目录</span>
$ <span class="token builtin class-name">cd</span> hyperledger-fabric
<span class="token comment"># 下载并执行脚本, [ ***语法格式*** ] - </span>
<span class="token comment"># 下边是具体的执行命令 - 看我</span>
<span class="token comment"># 下边是具体的执行命令 - 看我</span>
<span class="token comment"># 下边是具体的执行命令 -- 重要的事情说三遍, 使用下边不翻墙的命令</span>
$ <span class="token function">curl</span> -sSL http://bit.ly/2ysbOFE <span class="token operator">|</span> <span class="token function">bash</span> -s <span class="token operator">&lt;</span>fabric<span class="token operator">&gt;</span> <span class="token operator">&lt;</span>fabric-ca<span class="token operator">&gt;</span> <span class="token operator">&lt;</span>thirdparty<span class="token operator">&gt;</span>
	- fabric: fabric的版本
	- fabric-ca: fabric-ca的版本
	- thirdparty: 第三方库的版本
<span class="token comment"># 下载并执行脚本, [ ***需要翻墙, 需要翻墙, 需要翻墙, 需要翻墙, 需要翻墙,*** ]</span>
$ <span class="token function">curl</span> -sSL http://bit.ly/2ysbOFE <span class="token operator">|</span> <span class="token function">bash</span> -s <span class="token number">1.2</span>.1 <span class="token number">1.2</span>.1 <span class="token number">0.4</span>.10
	- http://bit.ly/2ysbOFE: 该地址必须翻墙才能访问
<span class="token comment"># ***不翻墙的方式***</span>
$ <span class="token function">curl</span> -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh <span class="token operator">|</span> <span class="token function">bash</span> -s <span class="token number">1.2</span>.1 <span class="token number">1.2</span>.1 <span class="token number">0.4</span>.10

<span class="token comment"># 其中参数说明如下：</span>
<span class="token number">2.0</span>.0：表示Hyperledger Fabric的版本号
<span class="token number">1.4</span>.4：表示Fabric CA的版本号
<span class="token number">0.4</span>.18：表示第三方引用的版本号
$ <span class="token function">curl</span> -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh <span class="token operator">|</span> <span class="token function">bash</span> -s <span class="token number">2.0</span>.0 <span class="token number">1.4</span>.4 <span class="token number">0.4</span>.18
可使用如下命令查看是否下载成功

<span class="token comment"># 该脚本启动之后会下载两个压缩包和一些镜像文件, 整个过程会比较长, 耐心等待...</span>
<span class="token comment"># 温馨提示: 这个过程会让你产生想要砸电脑的冲动, 控制好你的情绪!!!!</span>
<span class="token comment"># 上述命令刚开始会下载以下两个压缩包, 这两个包下载速度特别慢慢慢慢慢慢慢.......</span>
<span class="token comment"># 	1. hyperledger-fabric-linux-amd64-1.2.0.tar.gz</span>
<span class="token comment"># 	2. hyperledger-fabric-ca-linux-amd64-1.2.0.tar.gz</span>
以上两个压缩包下载下来之后会被解压, 解压目录:
~/hyperledger-fabric/fabric-samples
</code></pre></div></li></ol> <p>可以将事先下载好的两个压缩包放到该目录下, 提高下载速度 (强烈建议), 放好之后再重新执行上边的curl命令</p> <div class="language- extra-class"><pre class="language-text"><code>
安装过程中输出的log信息

&gt; Installing hyperledger/fabric-samples repo
&gt;
&gt; ===&gt; Cloning hyperledger/fabric-samples repo and checkout v1.2.0
&gt; 正克隆到 'fabric-samples'...
&gt; remote: Enumerating objects: 29, done.
&gt; remote: Counting objects: 100% (29/29), done.
&gt; remote: Compressing objects: 100% (28/28), done.
&gt; remote: Total 1821 (delta 5), reused 25 (delta 1), pack-reused 1792
&gt; 接收对象中: 100% (1821/1821), 646.82 KiB | 156.00 KiB/s, 完成.
&gt; 处理 delta 中: 100% (877/877), 完成.
&gt; 注意：正在检出 'v1.2.0'。
&gt;
&gt; 您正处于分离头指针状态。您可以查看、做试验性的修改及提交，并且您可以通过另外
&gt; 的检出分支操作丢弃在这个状态下所做的任何提交。
&gt;
&gt; 如果您想要通过创建分支来保留在此状态下所做的提交，您可以通过在检出命令添加
&gt; 参数 -b 来实现（现在或稍后）。例如：
&gt;
&gt;   git checkout -b &lt;新分支名&gt;
&gt;
&gt; HEAD 目前位于 ed81d7b [FAB-10811] fabric-ca sample is broken on v1.2
&gt;
&gt; Installing Hyperledger Fabric binaries
&gt;
&gt; ===&gt; Downloading version 1.2.0 platform specific fabric binaries
&gt; ===&gt; Downloading:  https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.2.0/hyperledger-fabric-linux-amd64-1.2.0.tar.gz
&gt;   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
&gt; ​                                 Dload  Upload   Total   Spent    Left  Speed
&gt;   4 39.0M    4 1650k    0     0   7322      0  1:33:08  0:03:50  1:29:18  1642
&gt; ==&gt; File downloaded. Verifying the md5sum...
&gt; ==&gt; Extracting hyperledger-fabric-linux-amd64-1.2.0.tar.gz...
&gt; ==&gt; Done.
&gt; ===&gt; Downloading version 1.2.0 platform specific fabric-ca-client binary
&gt; ===&gt; Downloading:  https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric-ca/hyperledger-fabric-ca/linux-amd64-1.2.0/hyperledger-fabric-ca-linux-amd64-1.2.0.tar.gz
&gt; ==&gt; Partial binary file found. Resuming download...
&gt; ==&gt; File downloaded. Verifying the md5sum...
&gt; ==&gt; Extracting hyperledger-fabric-ca-linux-amd64-1.2.0.tar.gz...
&gt; ==&gt; Done.
&gt;
&gt; Installing Hyperledger Fabric docker images
&gt;
&gt; ===&gt; Pulling fabric Images
&gt; ==&gt; FABRIC IMAGE: peer
&gt;
&gt; 1.2.0: Pulling from hyperledger/fabric-peer
&gt; b234f539f7a1: Pull complete 
&gt; 55172d420b43: Pull complete 
&gt; 5ba5bbeb6b91: Pull complete 
&gt; 43ae2841ad7a: Pull complete 
&gt; f6c9c6de4190: Pull complete 
&gt; c6af77e36488: Pull complete 
&gt; 964f7f4f22f3: Pull complete 
&gt; d4a3f4cfba3d: Pull complete 
&gt; 73782018d902: Pull complete 
&gt; 039eb34e730e: Pull complete 
&gt; Digest: sha256:949b38bad9496d7694b54d30b90b72653804d761a44d721c4dc7a16a5cbcabe8
&gt; Status: Downloaded newer image for hyperledger/fabric-peer:1.2.0
&gt; ==&gt; FABRIC IMAGE: orderer
&gt;
&gt; 1.2.0: Pulling from hyperledger/fabric-orderer
&gt; b234f539f7a1: Already exists 
&gt; 55172d420b43: Already exists 
&gt; 5ba5bbeb6b91: Already exists 
&gt; 43ae2841ad7a: Already exists 
&gt; f6c9c6de4190: Already exists 
&gt; c6af77e36488: Already exists 
&gt; 964f7f4f22f3: Already exists 
&gt; d4a3f4cfba3d: Already exists 
&gt; 8d0e11f5a0f7: Pull complete 
&gt; 0bda0f004d88: Pull complete 
&gt; Digest: sha256:a10f6d1d4cbb5a0264634c8b5ec63ff6cbbfc7c9fb369a06cc6dfe504d976259
&gt; Status: Downloaded newer image for hyperledger/fabric-orderer:1.2.0
&gt; ==&gt; FABRIC IMAGE: ccenv
&gt;
&gt; 1.2.0: Pulling from hyperledger/fabric-ccenv
&gt; b234f539f7a1: Already exists 
&gt; 55172d420b43: Already exists 
&gt; 5ba5bbeb6b91: Already exists 
&gt; 43ae2841ad7a: Already exists 
&gt; f6c9c6de4190: Already exists 
&gt; c6af77e36488: Already exists 
&gt; 964f7f4f22f3: Already exists 
&gt; 13cd31405e09: Pull complete 
&gt; e03b35c19d96: Pull complete 
&gt; 96c2920985e3: Pull complete 
&gt; e91461be8304: Pull complete 
&gt; 950c3368692b: Pull complete 
&gt; c5de8d20c137: Pull complete 
&gt; 5536b64bc67b: Pull complete 
&gt; Digest: sha256:0a7fb37111cafce79cf89ca8d1af5ca6f721e60a8bd1b2b93521e671e3348af2
&gt; Status: Downloaded newer image for hyperledger/fabric-ccenv:1.2.0
&gt; ==&gt; FABRIC IMAGE: tools
&gt;
&gt; 1.2.0: Pulling from hyperledger/fabric-tools
&gt; b234f539f7a1: Already exists 
&gt; 55172d420b43: Already exists 
&gt; 5ba5bbeb6b91: Already exists 
&gt; 43ae2841ad7a: Already exists 
&gt; f6c9c6de4190: Already exists 
&gt; c6af77e36488: Already exists 
&gt; 964f7f4f22f3: Already exists 
&gt; 13cd31405e09: Already exists 
&gt; e03b35c19d96: Already exists 
&gt; 96c2920985e3: Already exists 
&gt; e91461be8304: Already exists 
&gt; 314928def9dd: Pull complete 
&gt; d5b68ae13f8d: Pull complete 
&gt; dde25187799d: Pull complete 
&gt; Digest: sha256:24cca44a2f2ab6325c6ccc1c91a10bd3e0e71764037a85a473f7e9621b3a0f91
&gt; Status: Downloaded newer image for hyperledger/fabric-tools:1.2.0
&gt; ===&gt; Pulling fabric ca Image
&gt; ==&gt; FABRIC CA IMAGE
&gt;
&gt; 1.2.0: Pulling from hyperledger/fabric-ca
&gt; b234f539f7a1: Already exists 
&gt; 55172d420b43: Already exists 
&gt; 5ba5bbeb6b91: Already exists 
&gt; 43ae2841ad7a: Already exists 
&gt; f6c9c6de4190: Already exists 
&gt; c6af77e36488: Already exists 
&gt; 964f7f4f22f3: Already exists 
&gt; f7a6370a6f7f: Pull complete 
&gt; 37cc94e973b2: Pull complete 
&gt; a80e45d2f608: Pull complete 
&gt; 8feb19f73d3a: Pull complete 
&gt; 5f3ea048e0c0: Pull complete 
&gt; Digest: sha256:5fe6d502e52ec2a8d98ee5653e1ba31952098115fb57710ddae86f2c3cc82dad
&gt; Status: Downloaded newer image for hyperledger/fabric-ca:1.2.0
&gt; ===&gt; Pulling thirdparty docker images
&gt; ==&gt; THIRDPARTY DOCKER IMAGE: couchdb
&gt;
&gt; 0.4.10: Pulling from hyperledger/fabric-couchdb
&gt; b234f539f7a1: Already exists 
&gt; 55172d420b43: Already exists 
&gt; 5ba5bbeb6b91: Already exists 
&gt; 43ae2841ad7a: Already exists 
&gt; f6c9c6de4190: Already exists 
&gt; c6af77e36488: Already exists 
&gt; 964f7f4f22f3: Already exists 
&gt; 13cd31405e09: Already exists 
&gt; e03b35c19d96: Already exists 
&gt; 96c2920985e3: Already exists 
&gt; e91461be8304: Already exists 
&gt; 6a752ce8f7fe: Pull complete 
&gt; a49e2cb854b0: Pull complete 
&gt; 493b25e70e6d: Pull complete 
&gt; 2721753a3e7c: Pull complete 
&gt; adede0f2a5f1: Pull complete 
&gt; 9eb593f76305: Pull complete 
&gt; bb49a3450e11: Pull complete 
&gt; 929b9bb5d788: Pull complete 
&gt; Digest: sha256:c65891b6c2374a06aff61dad8cd60e1f7a8dc2b72cc9f6f5c2f853f94509c1b1
&gt; Status: Downloaded newer image for hyperledger/fabric-couchdb:0.4.10
&gt; ==&gt; THIRDPARTY DOCKER IMAGE: kafka
&gt;
&gt; 0.4.10: Pulling from hyperledger/fabric-kafka
&gt; b234f539f7a1: Already exists 
&gt; 55172d420b43: Already exists 
&gt; 5ba5bbeb6b91: Already exists 
&gt; 43ae2841ad7a: Already exists 
&gt; f6c9c6de4190: Already exists 
&gt; c6af77e36488: Already exists 
&gt; 964f7f4f22f3: Already exists 
&gt; 13cd31405e09: Already exists 
&gt; e03b35c19d96: Already exists 
&gt; 96c2920985e3: Already exists 
&gt; e91461be8304: Already exists 
&gt; 146aa6695f33: Pull complete 
&gt; 954e41d8cd46: Pull complete 
&gt; 9d750070047f: Pull complete 
&gt; Digest: sha256:3b58cd0f26e7f4d8c49373d6b91e1e465a97321ce106da9c055ed452bb9d7184
&gt; Status: Downloaded newer image for hyperledger/fabric-kafka:0.4.10
&gt; ==&gt; THIRDPARTY DOCKER IMAGE: zookeeper
&gt;
&gt; 0.4.10: Pulling from hyperledger/fabric-zookeeper
&gt; b234f539f7a1: Already exists 
&gt; 55172d420b43: Already exists 
&gt; 5ba5bbeb6b91: Already exists 
&gt; 43ae2841ad7a: Already exists 
&gt; f6c9c6de4190: Already exists 
&gt; c6af77e36488: Already exists 
&gt; 964f7f4f22f3: Already exists 
&gt; 13cd31405e09: Already exists 
&gt; e03b35c19d96: Already exists 
&gt; 96c2920985e3: Already exists 
&gt; e91461be8304: Already exists 
&gt; c335e6e59168: Pull complete 
&gt; 016e000b0cc8: Pull complete 
&gt; e716b0c9790c: Pull complete 
&gt; 390f47e71470: Pull complete 
&gt; Digest: sha256:151fe67421663fe860c1aba4b80877a22b6b8fa18cbc97990c309c603cd6f5f1
&gt; Status: Downloaded newer image for hyperledger/fabric-zookeeper:0.4.10

**通过上述操作拉取的docker镜像为:**

|         镜像文件名称         |                        用途                        |
| :--------------------------: | :------------------------------------------------: |
|   hyperledger/fabric-peer    |                  peer模块镜像文件                  |
|  hyperledger/fabric-orderer  |               orderer节点库镜像文件                |
|   hyperledger/fabric-ccenv   |         Go语言chaincode运行环境库镜像文件          |
|   hyperledger/fabric-tools   | 相关工具镜像文件包含了cryptogen, configtxgen等工具 |
|    hyperledger/fabric-ca     |                   CA模块镜像文件                   |
|  hyperledger/fabric-couchdb  |               couchdb数据库镜像文件                |
|   hyperledger/fabric-kafka   |                  kafka库镜像文件                   |
| hyperledger/fabric-zookeeper |                zookeeper库镜像文件                 |

下载完，可以看到已经下载的docker相关镜像

&gt; ===&gt; List out hyperledger docker images
&gt;
&gt; hyperledger/fabric-ca                1.2.0               66cc132bd09c        2 months ago        252MB
&gt;
&gt; hyperledger/fabric-ca                latest              66cc132bd09c        2 months ago        252MB
&gt; hyperledger/fabric-tools            1.2.0               379602873003        2 months ago        1.51GB
&gt; hyperledger/fabric-tools            latest              379602873003        2 months ago        1.51GB
&gt; hyperledger/fabric-ccenv           1.2.0               6acf31e2d9a4        2 months ago        1.43GB
&gt; hyperledger/fabric-ccenv           latest              6acf31e2d9a4        2 months ago        1.43GB
&gt; hyperledger/fabric-orderer        1.2.0               4baf7789a8ec        2 months ago        152MB
&gt; hyperledger/fabric-orderer        latest              4baf7789a8ec        2 months ago        152MB
&gt; hyperledger/fabric-peer             1.2.0               82c262e65984        2 months ago        159MB
&gt; hyperledger/fabric-peer             latest              82c262e65984        2 months ago        159MB
&gt; hyperledger/fabric-zookeeper   0.4.10              2b51158f3898        2 months ago        1.44GB
&gt; hyperledger/fabric-zookeeper    latest              2b51158f3898        2 months ago        1.44GB
&gt; hyperledger/fabric-kafka      	  0.4.10              936aef6db0e6        2 months ago        1.45GB
&gt; hyperledger/fabric-kafka       	   latest              936aef6db0e6        2 months ago        1.45GB
&gt; hyperledger/fabric-couchdb      0.4.10              3092eca241fc        2 months ago        1.61GB
&gt; hyperledger/fabric-couchdb       latest              3092eca241fc        2 months ago        1.61GB

1. 设置全局访问

```shell
# 进入到 ~/hyperledger-fabric/fabric-samples/bin 目录
$ cd ~/hyperledger-fabric/fabric-samples/bin
itcast@ubuntu:~/hyperledger-fabric/fabric-samples/bin$ tree
    .
    ├── configtxgen
    ├── configtxlator
    ├── cryptogen
    ├── discover
    ├── fabric-ca-client
    ├── get-docker-images.sh
    ├── idemixgen
    ├── orderer
    └── peer
# 将这些二进制文件拷贝到 /usr/local/bin 目录下
$ sudo cp * /usr/local/bin
# 执行完上述操作之后, fabric的这些可执行程序就可以在全局范围内使用了
</code></pre></div><h3 id="_1-5-first-network-环境测试"><a href="#_1-5-first-network-环境测试" class="header-anchor">#</a> 1.5 First-Network 环境测试</h3> <h4 id="_1-5-1-生成相应文件"><a href="#_1-5-1-生成相应文件" class="header-anchor">#</a> 1.5.1 生成相应文件</h4> <p><strong>执行 ./byfn.sh generate 命令生成相应的文件</strong></p> <div class="language-shell extra-class"><pre class="language-shell"><code>$ <span class="token builtin class-name">cd</span> ~/hyperledger-fabric/fabric-samples/first-network/
$ ./byfn.sh generate	
</code></pre></div><blockquote><p>Generating certs and genesis block for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n] y
proceeding ...
/home/zoro/hyperledger-fabric/fabric-samples/first-network/../bin/cryptogen</p> <h6 id=""><a href="#" class="header-anchor">#</a></h6> <p><font color="blue" size="5">Generate certificates using cryptogen tool</font></p> <h6 id="-2"><a href="#-2" class="header-anchor">#</a></h6> <ul><li><font color="red">cryptogen generate --config=./crypto-config.yaml</font>
org1.example.com
org2.example.com</li> <li>res=0</li> <li>set +x</li></ul> <p>/home/zoro/hyperledger-fabric/fabric-samples/first-network/../bin/configtxgen</p> <h6 id="-3"><a href="#-3" class="header-anchor">#</a></h6> <p><font color="blue" size="5">Generating Orderer Genesis block</font></p> <h6 id="-4"><a href="#-4" class="header-anchor">#</a></h6> <ul><li><font color="red">configtxgen <strong>-profile</strong> TwoOrgsOrdererGenesis <strong>-outputBlock</strong> ./channel-artifacts/genesis.block</font>
2018-09-23 11:03:32.183 CST [common/tools/configtxgen] main -&gt; WARN 001 Omitting the channel ID for configtxgen is deprecated.  Explicitly passing the channel ID will be required in the future, defaulting to 'testchainid'.
2018-09-23 11:03:32.183 CST [common/tools/configtxgen] main -&gt; INFO 002 Loading configuration
2018-09-23 11:03:32.190 CST [common/tools/configtxgen/encoder] NewChannelGroup -&gt; WARN 003 Default policy emission is deprecated, please include policy specificiations for the channel group in configtx.yaml
2018-09-23 11:03:32.191 CST [common/tools/configtxgen/encoder] NewOrdererGroup -&gt; WARN 004 Default policy emission is deprecated, please include policy specificiations for the orderer group in configtx.yaml
2018-09-23 11:03:32.191 CST [common/tools/configtxgen/encoder] NewOrdererOrgGroup -&gt; WARN 005 Default policy emission is deprecated, please include policy specificiations for the orderer org group OrdererOrg in configtx.yaml
2018-09-23 11:03:32.192 CST [msp] getMspConfig -&gt; INFO 006 Loading NodeOUs
2018-09-23 11:03:32.192 CST [common/tools/configtxgen/encoder] NewOrdererOrgGroup -&gt; WARN 007 Default policy emission is deprecated, please include policy specificiations for the orderer org group Org1MSP in configtx.yaml
2018-09-23 11:03:32.193 CST [msp] getMspConfig -&gt; INFO 008 Loading NodeOUs
2018-09-23 11:03:32.193 CST [common/tools/configtxgen/encoder] NewOrdererOrgGroup -&gt; WARN 009 Default policy emission is deprecated, please include policy specificiations for the orderer org group Org2MSP in configtx.yaml
2018-09-23 11:03:32.193 CST [common/tools/configtxgen] doOutputBlock -&gt; INFO 00a Generating genesis block
2018-09-23 11:03:32.194 CST [common/tools/configtxgen] doOutputBlock -&gt; INFO 00b Writing genesis block</li> <li>res=0</li> <li>set +x</li></ul> <h6 id="-5"><a href="#-5" class="header-anchor">#</a></h6> <p><font color="blue" size="5">Generating channel configuration transaction 'channel.tx'</font></p> <h6 id="-6"><a href="#-6" class="header-anchor">#</a></h6> <ul><li><font color="red">configtxgen <strong>-profile</strong> TwoOrgsChannel <strong>-outputCreateChannelTx</strong> ./channel-artifacts/channel.tx <strong>-channelID</strong> mychannel</font>
2018-09-23 11:03:32.238 CST [common/tools/configtxgen] main -&gt; INFO 001 Loading configuration
2018-09-23 11:03:32.252 CST [common/tools/configtxgen] doOutputChannelCreateTx -&gt; INFO 002 Generating new channel configtx
2018-09-23 11:03:32.253 CST [common/tools/configtxgen/encoder] NewApplicationGroup -&gt; WARN 003 Default policy emission is deprecated, please include policy specificiations for the application group in configtx.yaml
2018-09-23 11:03:32.253 CST [msp] getMspConfig -&gt; INFO 004 Loading NodeOUs
2018-09-23 11:03:32.254 CST [common/tools/configtxgen/encoder] NewApplicationOrgGroup -&gt; WARN 005 Default policy emission is deprecated, please include policy specificiations for the application org group Org1MSP in configtx.yaml
2018-09-23 11:03:32.254 CST [msp] getMspConfig -&gt; INFO 006 Loading NodeOUs
2018-09-23 11:03:32.254 CST [common/tools/configtxgen/encoder] NewApplicationOrgGroup -&gt; WARN 007 Default policy emission is deprecated, please include policy specificiations for the application org group Org2MSP in configtx.yaml
2018-09-23 11:03:32.257 CST [common/tools/configtxgen] doOutputChannelCreateTx -&gt; INFO 008 Writing new channel tx</li> <li>res=0</li> <li>set +x</li></ul> <h6 id="-7"><a href="#-7" class="header-anchor">#</a></h6> <p><font color="blue" size="5">Generating anchor peer update for Org1MSP</font></p> <h6 id="-8"><a href="#-8" class="header-anchor">#</a></h6> <ul><li><font color="red">configtxgen <strong>-profile</strong> TwoOrgsChannel <strong>-outputAnchorPeersUpdate</strong> ./channel-artifacts/Org1MSPanchors.tx <strong>-channelID</strong> mychannel <strong>-asOrg</strong> Org1MSP</font>
2018-09-23 11:03:32.298 CST [common/tools/configtxgen] main -&gt; INFO 001 Loading configuration
2018-09-23 11:03:32.307 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -&gt; INFO 002 Generating anchor peer update
2018-09-23 11:03:32.307 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -&gt; INFO 003 Writing anchor peer update</li> <li>res=0</li> <li>set +x</li></ul> <h6 id="-9"><a href="#-9" class="header-anchor">#</a></h6> <p><font color="blue" size="5">Generating anchor peer update for Org2MSP</font></p> <h6 id="-10"><a href="#-10" class="header-anchor">#</a></h6> <ul><li><font color="red">configtxgen <strong>-profile</strong> TwoOrgsChannel <strong>-outputAnchorPeersUpdate</strong> ./channel-artifacts/Org2MSPanchors.tx <strong>-channelID</strong> mychannel <strong>-asOrg</strong> Org2MSP</font>
2018-09-23 11:03:32.350 CST [common/tools/configtxgen] main -&gt; INFO 001 Loading configuration
2018-09-23 11:03:32.362 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -&gt; INFO 002 Generating anchor peer update
2018-09-23 11:03:32.363 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -&gt; INFO 003 Writing anchor peer update</li> <li>res=0</li> <li>set +x</li></ul></blockquote> <h4 id="_1-5-2-启动网路"><a href="#_1-5-2-启动网路" class="header-anchor">#</a> 1.5.2 启动网路</h4> <p><strong>执行 ./byfn.sh up 启动网络</strong></p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># byfn == build your first network</span>
$ ./byfn.sh up
</code></pre></div><p>当我们看到START的时候，表示启动成功。</p> <blockquote><p>Starting for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n] y
proceeding ...
LOCAL_VERSION=1.2.0
DOCKER_IMAGE_VERSION=1.2.0
Creating network &quot;net_byfn&quot; with the default driver
Creating volume &quot;net_peer0.org2.example.com&quot; with default driver
Creating volume &quot;net_peer1.org2.example.com&quot; with default driver
Creating volume &quot;net_peer1.org1.example.com&quot; with default driver
Creating volume &quot;net_peer0.org1.example.com&quot; with default driver
Creating volume &quot;net_orderer.example.com&quot; with default driver
Creating peer1.org1.example.com ... done
Creating peer0.org1.example.com ... done
Creating peer0.org2.example.com ... done
Creating orderer.example.com    ... done
Creating peer1.org2.example.com ... done
Creating cli                    ... done</p> <p>​                                                                        <font color="red" size="24">START</font></p> <p>Build your first network (BYFN) end-to-end test</p> <p>Channel name : mychannel
Creating channel...</p> <ul><li><font color="red">peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem</font></li> <li>res=0</li> <li>set +x
2018-09-23 03:03:55.350 UTC [channelCmd] InitCmdFactory -&gt; INFO 001 Endorser and orderer connections initialized
2018-09-23 03:03:55.420 UTC [cli/common] readBlock -&gt; INFO 002 Got status: &amp;{NOT_FOUND}
2018-09-23 03:03:55.422 UTC [channelCmd] InitCmdFactory -&gt; INFO 003 Endorser and orderer connections initialized
2018-09-23 03:03:55.629 UTC [cli/common] readBlock -&gt; INFO 004 Received block: 0
===================== Channel 'mychannel' created =====================</li></ul> <p>Having all peers join the channel...</p> <ul><li>peer channel join -b mychannel.block</li> <li>res=0</li> <li>set +x
2018-09-23 03:03:55.699 UTC [channelCmd] InitCmdFactory -&gt; INFO 001 Endorser and orderer connections initialized
2018-09-23 03:03:55.807 UTC [channelCmd] executeJoin -&gt; INFO 002 Successfully submitted proposal to join channel
===================== peer0.org1 joined channel 'mychannel' =====================</li> <li>peer channel join -b mychannel.block</li> <li>res=0</li> <li>set +x
2018-09-23 03:03:58.874 UTC [channelCmd] InitCmdFactory -&gt; INFO 001 Endorser and orderer connections initialized
2018-09-23 03:03:58.976 UTC [channelCmd] executeJoin -&gt; INFO 002 Successfully submitted proposal to join channel
===================== peer1.org1 joined channel 'mychannel' =====================</li> <li>peer channel join -b mychannel.block</li> <li>res=0</li> <li>set +x
2018-09-23 03:04:02.058 UTC [channelCmd] InitCmdFactory -&gt; INFO 001 Endorser and orderer connections initialized
2018-09-23 03:04:02.169 UTC [channelCmd] executeJoin -&gt; INFO 002 Successfully submitted proposal to join channel
===================== peer0.org2 joined channel 'mychannel' =====================</li> <li>peer channel join -b mychannel.block</li> <li>res=0</li> <li>set +x
2018-09-23 03:04:05.231 UTC [channelCmd] InitCmdFactory -&gt; INFO 001 Endorser and orderer connections initialized
2018-09-23 03:04:05.339 UTC [channelCmd] executeJoin -&gt; INFO 002 Successfully submitted proposal to join channel
===================== peer1.org2 joined channel 'mychannel' =====================</li></ul> <p>Updating anchor peers for org1...</p> <ul><li>peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem</li> <li>res=0</li> <li>set +x
2018-09-23 03:04:08.406 UTC [channelCmd] InitCmdFactory -&gt; INFO 001 Endorser and orderer connections initialized
2018-09-23 03:04:08.422 UTC [channelCmd] update -&gt; INFO 002 Successfully submitted channel update
===================== Anchor peers updated for org 'Org1MSP' on channel 'mychannel' =====================</li></ul> <p>Updating anchor peers for org2...</p> <ul><li>peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem</li> <li>res=0</li> <li>set +x
2018-09-23 03:04:11.503 UTC [channelCmd] InitCmdFactory -&gt; INFO 001 Endorser and orderer connections initialized
2018-09-23 03:04:11.519 UTC [channelCmd] update -&gt; INFO 002 Successfully submitted channel update
===================== Anchor peers updated for org 'Org2MSP' on channel 'mychannel' =====================</li></ul> <p>Installing chaincode on peer0.org1...</p> <ul><li>peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/</li> <li>res=0</li> <li>set +x
2018-09-23 03:04:14.610 UTC [chaincodeCmd] checkChaincodeCmdParams -&gt; INFO 001 Using default escc
2018-09-23 03:04:14.610 UTC [chaincodeCmd] checkChaincodeCmdParams -&gt; INFO 002 Using default vscc
2018-09-23 03:04:15.000 UTC [chaincodeCmd] install -&gt; INFO 003 Installed remotely response:&lt;status:200 payload:&quot;OK&quot; &gt;
===================== Chaincode is installed on peer0.org1 =====================</li></ul> <p>Install chaincode on peer0.org2...</p> <ul><li>peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/</li> <li>res=0</li> <li>set +x
2018-09-23 03:04:15.069 UTC [chaincodeCmd] checkChaincodeCmdParams -&gt; INFO 001 Using default escc
2018-09-23 03:04:15.069 UTC [chaincodeCmd] checkChaincodeCmdParams -&gt; INFO 002 Using default vscc
2018-09-23 03:04:15.203 UTC [chaincodeCmd] install -&gt; INFO 003 Installed remotely response:&lt;status:200 payload:&quot;OK&quot; &gt;
===================== Chaincode is installed on peer0.org2 =====================</li></ul> <p>Instantiating chaincode on peer0.org2...</p> <ul><li>peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -l golang -v 1.0 -c '{&quot;Args&quot;:[&quot;init&quot;,&quot;a&quot;,&quot;100&quot;,&quot;b&quot;,&quot;200&quot;]}' -P 'AND ('''Org1MSP.peer''','''Org2MSP.peer''')'</li> <li>res=0</li> <li>set +x
2018-09-23 03:04:15.284 UTC [chaincodeCmd] checkChaincodeCmdParams -&gt; INFO 001 Using default escc
2018-09-23 03:04:15.284 UTC [chaincodeCmd] checkChaincodeCmdParams -&gt; INFO 002 Using default vscc
===================== Chaincode is instantiated on peer0.org2 on channel 'mychannel' =====================</li></ul> <p>Querying chaincode on peer0.org1...
===================== Querying on peer0.org1 on channel 'mychannel'... =====================
Attempting to Query peer0.org1 ...3 secs</p> <ul><li>peer chaincode query -C mychannel -n mycc -c '{&quot;Args&quot;:[&quot;query&quot;,&quot;a&quot;]}'</li> <li>res=0</li> <li>set +x</li></ul> <p>100
===================== Query successful on peer0.org1 on channel 'mychannel' =====================
Sending invoke transaction on peer0.org1 peer0.org2...</p> <ul><li>peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{&quot;Args&quot;:[&quot;invoke&quot;,&quot;a&quot;,&quot;b&quot;,&quot;10&quot;]}'</li> <li>res=0</li> <li>set +x
2018-09-23 03:05:17.876 UTC [chaincodeCmd] chaincodeInvokeOrQuery -&gt; INFO 001 Chaincode invoke successful. result: status:200
===================== Invoke transaction successful on peer0.org1 peer0.org2 on channel 'mychannel' =====================</li></ul> <p>Installing chaincode on peer1.org2...</p> <ul><li>peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/</li> <li>res=0</li> <li>set +x
2018-09-23 03:05:17.966 UTC [chaincodeCmd] checkChaincodeCmdParams -&gt; INFO 001 Using default escc
2018-09-23 03:05:17.966 UTC [chaincodeCmd] checkChaincodeCmdParams -&gt; INFO 002 Using default vscc
2018-09-23 03:05:18.340 UTC [chaincodeCmd] install -&gt; INFO 003 Installed remotely response:&lt;status:200 payload:&quot;OK&quot; &gt;
===================== Chaincode is installed on peer1.org2 =====================</li></ul> <p>Querying chaincode on peer1.org2...
===================== Querying on peer1.org2 on channel 'mychannel'... =====================
Attempting to Query peer1.org2 ...3 secs</p> <ul><li>peer chaincode query -C mychannel -n mycc -c '{&quot;Args&quot;:[&quot;query&quot;,&quot;a&quot;]}'</li> <li>res=0</li> <li>set +x</li></ul> <p>90
===================== Query successful on peer1.org2 on channel 'mychannel' =====================</p> <p>========= All GOOD, BYFN execution completed ===========</p> <p>​                                                                             <font color="red" size="24">END</font></p></blockquote> <p>执行结束，显示END</p> <ol><li><p><strong>通过docker ps命令可以查看到节点的启动情况。</strong></p> <div class="language-shell extra-class"><pre class="language-shell"><code>$ docker <span class="token function">ps</span>
</code></pre></div></li> <li><p><strong>如果我们要停止网络，可以执行./byfn.sh down 命令来停止</strong></p> <div class="language-shell extra-class"><pre class="language-shell"><code>$ ./byfn.sh down
</code></pre></div><blockquote><p>Stopping for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n] y
proceeding ...
Stopping cli                    ... done
Stopping orderer.example.com    ... done
Stopping peer1.org2.example.com ... done
Stopping peer1.org1.example.com ... done
Stopping peer0.org2.example.com ... done
Stopping peer0.org1.example.com ... done
Removing cli                    ... done
Removing orderer.example.com    ... done
Removing peer1.org2.example.com ... done
Removing peer1.org1.example.com ... done
Removing peer0.org2.example.com ... done
Removing peer0.org1.example.com ... done
Removing network net_byfn
Removing volume net_peer0.org3.example.com
WARNING: Volume net_peer0.org3.example.com not found.
Removing volume net_peer1.org3.example.com
WARNING: Volume net_peer1.org3.example.com not found.
Removing volume net_orderer.example.com
Removing volume net_peer0.org2.example.com
Removing volume net_peer0.org1.example.com
Removing volume net_peer1.org1.example.com
Removing volume net_peer1.org2.example.com
80510c01c3e8
3625e4ce1b01
43b4b0dfb14f
Untagged: dev-peer1.org2.example.com-mycc-1.0-26c2ef32838554aac4f7ad6f100aca865e87959c9a126e86d764c8d01f8346ab:latest
Deleted: sha256:3c7cf25f6520e39afe9ca0770821bcf8892c398ffa8fafaa4d39d4b18bf9a7af
Deleted: sha256:ac116d2c1fbb503f766149a2acf422b754d59ba4be58902981d03b2969ef21c1
Deleted: sha256:3e07d57882218fc26936d29deefba9e3bb0230d63b5e82d727ddbc92c59d942d
Deleted: sha256:9c88b5b791167d2d37be1fc39886e5efa00d522aad7df03869b8eb30aa564b5f
Untagged: dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9:latest
Deleted: sha256:16229f944e6c2e665587638a47c80d9594693aede0d25d736d7225370efc67ae
Deleted: sha256:6a5c627fbc23a646b17a493a6b7df67a2535501b8d77915aab6ac2c1ba97b1b3
Deleted: sha256:4d0d3e96c80a3e0ee4c3553a125c99bbaffe6f1b487348f87ffb3059d6eb7f2e
Deleted: sha256:a9600d47e71d3abb5f5afcbf56b6b21955e1bbe7fcb92040f1349667cf712bc0
Untagged: dev-peer0.org2.example.com-mycc-1.0-15b571b3ce849066b7ec74497da3b27e54e0df1345daff3951b94245ce09c42b:latest
Deleted: sha256:5f7c63593550d018ab28312c3d040b27a53f2d1e844ddd7d50a2fcf63454594b
Deleted: sha256:a00c5883309d6a80aaf22f8b704b594c6129150c5048fd00d742077f212b28f7
Deleted: sha256:71fae53aba930c88450ff286a5e54bceece45ea7aee465a8f2806aa967ab2b21
Deleted: sha256:08fe44e007fd3d5377b44cca32e8f78d2249b0a1d9ce9312c68636fdacda2edc</p></blockquote></li></ol></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">上次更新:</span> <span class="time">1/28/2021, 12:15:56 PM</span></div></footer> <!----> </main></div><div class="global-ui"></div></div>
    <script src="/assets/js/app.cb35c8f6.js" defer></script><script src="/assets/js/2.063846a6.js" defer></script><script src="/assets/js/4.1ffb4609.js" defer></script><script src="/assets/js/63.4df55c8b.js" defer></script>
  </body>
</html>
